wandb 0.22.1__py3-none-win_arm64.whl

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 (919) hide show
  1. package_readme.md +97 -0
  2. wandb/__init__.py +248 -0
  3. wandb/__init__.pyi +1230 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_analytics.py +65 -0
  6. wandb/_iterutils.py +73 -0
  7. wandb/_pydantic/__init__.py +30 -0
  8. wandb/_pydantic/base.py +108 -0
  9. wandb/_pydantic/field_types.py +29 -0
  10. wandb/_pydantic/utils.py +80 -0
  11. wandb/_pydantic/v1_compat.py +301 -0
  12. wandb/_strutils.py +40 -0
  13. wandb/agents/__init__.py +0 -0
  14. wandb/agents/pyagent.py +386 -0
  15. wandb/analytics/__init__.py +3 -0
  16. wandb/analytics/sentry.py +267 -0
  17. wandb/apis/__init__.py +50 -0
  18. wandb/apis/attrs.py +52 -0
  19. wandb/apis/importers/__init__.py +1 -0
  20. wandb/apis/importers/internals/internal.py +375 -0
  21. wandb/apis/importers/internals/protocols.py +103 -0
  22. wandb/apis/importers/internals/util.py +78 -0
  23. wandb/apis/importers/mlflow.py +254 -0
  24. wandb/apis/importers/validation.py +108 -0
  25. wandb/apis/importers/wandb.py +1608 -0
  26. wandb/apis/internal.py +241 -0
  27. wandb/apis/normalize.py +83 -0
  28. wandb/apis/paginator.py +138 -0
  29. wandb/apis/public/__init__.py +78 -0
  30. wandb/apis/public/api.py +2513 -0
  31. wandb/apis/public/artifacts.py +1050 -0
  32. wandb/apis/public/automations.py +86 -0
  33. wandb/apis/public/const.py +6 -0
  34. wandb/apis/public/files.py +411 -0
  35. wandb/apis/public/history.py +203 -0
  36. wandb/apis/public/integrations.py +203 -0
  37. wandb/apis/public/jobs.py +744 -0
  38. wandb/apis/public/projects.py +278 -0
  39. wandb/apis/public/query_generator.py +179 -0
  40. wandb/apis/public/registries/__init__.py +7 -0
  41. wandb/apis/public/registries/_freezable_list.py +176 -0
  42. wandb/apis/public/registries/_utils.py +139 -0
  43. wandb/apis/public/registries/registries_search.py +353 -0
  44. wandb/apis/public/registries/registry.py +370 -0
  45. wandb/apis/public/reports.py +597 -0
  46. wandb/apis/public/runs.py +1438 -0
  47. wandb/apis/public/sweeps.py +441 -0
  48. wandb/apis/public/teams.py +237 -0
  49. wandb/apis/public/users.py +179 -0
  50. wandb/apis/public/utils.py +211 -0
  51. wandb/apis/reports/__init__.py +1 -0
  52. wandb/apis/reports/v1/__init__.py +8 -0
  53. wandb/apis/reports/v2/__init__.py +8 -0
  54. wandb/apis/workspaces/__init__.py +8 -0
  55. wandb/automations/__init__.py +73 -0
  56. wandb/automations/_filters/__init__.py +40 -0
  57. wandb/automations/_filters/expressions.py +182 -0
  58. wandb/automations/_filters/operators.py +259 -0
  59. wandb/automations/_filters/run_metrics.py +330 -0
  60. wandb/automations/_generated/__init__.py +104 -0
  61. wandb/automations/_generated/create_automation.py +17 -0
  62. wandb/automations/_generated/create_generic_webhook_integration.py +37 -0
  63. wandb/automations/_generated/delete_automation.py +15 -0
  64. wandb/automations/_generated/enums.py +35 -0
  65. wandb/automations/_generated/fragments.py +293 -0
  66. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
  67. wandb/automations/_generated/get_automations.py +24 -0
  68. wandb/automations/_generated/get_automations_by_entity.py +26 -0
  69. wandb/automations/_generated/input_types.py +104 -0
  70. wandb/automations/_generated/integrations_by_entity.py +22 -0
  71. wandb/automations/_generated/operations.py +647 -0
  72. wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
  73. wandb/automations/_generated/update_automation.py +17 -0
  74. wandb/automations/_utils.py +235 -0
  75. wandb/automations/_validators.py +185 -0
  76. wandb/automations/actions.py +220 -0
  77. wandb/automations/automations.py +85 -0
  78. wandb/automations/events.py +284 -0
  79. wandb/automations/integrations.py +45 -0
  80. wandb/automations/scopes.py +78 -0
  81. wandb/beta/workflows.py +324 -0
  82. wandb/bin/gpu_stats.exe +0 -0
  83. wandb/bin/wandb-core +0 -0
  84. wandb/cli/__init__.py +0 -0
  85. wandb/cli/beta.py +93 -0
  86. wandb/cli/beta_sync.py +224 -0
  87. wandb/cli/cli.py +2883 -0
  88. wandb/data_types.py +66 -0
  89. wandb/docker/__init__.py +290 -0
  90. wandb/docker/names.py +40 -0
  91. wandb/docker/wandb-entrypoint.sh +33 -0
  92. wandb/env.py +535 -0
  93. wandb/errors/__init__.py +17 -0
  94. wandb/errors/errors.py +40 -0
  95. wandb/errors/links.py +73 -0
  96. wandb/errors/term.py +415 -0
  97. wandb/errors/util.py +57 -0
  98. wandb/errors/warnings.py +2 -0
  99. wandb/filesync/__init__.py +0 -0
  100. wandb/filesync/dir_watcher.py +404 -0
  101. wandb/filesync/stats.py +100 -0
  102. wandb/filesync/step_checksum.py +142 -0
  103. wandb/filesync/step_prepare.py +179 -0
  104. wandb/filesync/step_upload.py +287 -0
  105. wandb/filesync/upload_job.py +142 -0
  106. wandb/integration/__init__.py +0 -0
  107. wandb/integration/catboost/__init__.py +5 -0
  108. wandb/integration/catboost/catboost.py +182 -0
  109. wandb/integration/cohere/__init__.py +3 -0
  110. wandb/integration/cohere/cohere.py +21 -0
  111. wandb/integration/cohere/resolver.py +347 -0
  112. wandb/integration/diffusers/__init__.py +3 -0
  113. wandb/integration/diffusers/autologger.py +76 -0
  114. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  115. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  116. wandb/integration/diffusers/resolvers/multimodal.py +881 -0
  117. wandb/integration/diffusers/resolvers/utils.py +102 -0
  118. wandb/integration/dspy/__init__.py +5 -0
  119. wandb/integration/dspy/dspy.py +422 -0
  120. wandb/integration/fastai/__init__.py +243 -0
  121. wandb/integration/gym/__init__.py +98 -0
  122. wandb/integration/huggingface/__init__.py +3 -0
  123. wandb/integration/huggingface/huggingface.py +18 -0
  124. wandb/integration/huggingface/resolver.py +213 -0
  125. wandb/integration/keras/__init__.py +11 -0
  126. wandb/integration/keras/callbacks/__init__.py +5 -0
  127. wandb/integration/keras/callbacks/metrics_logger.py +129 -0
  128. wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
  129. wandb/integration/keras/callbacks/tables_builder.py +228 -0
  130. wandb/integration/keras/keras.py +1086 -0
  131. wandb/integration/kfp/__init__.py +6 -0
  132. wandb/integration/kfp/helpers.py +28 -0
  133. wandb/integration/kfp/kfp_patch.py +335 -0
  134. wandb/integration/kfp/wandb_logging.py +182 -0
  135. wandb/integration/langchain/__init__.py +3 -0
  136. wandb/integration/langchain/wandb_tracer.py +49 -0
  137. wandb/integration/lightgbm/__init__.py +239 -0
  138. wandb/integration/lightning/__init__.py +0 -0
  139. wandb/integration/lightning/fabric/__init__.py +3 -0
  140. wandb/integration/lightning/fabric/logger.py +763 -0
  141. wandb/integration/metaflow/__init__.py +9 -0
  142. wandb/integration/metaflow/data_pandas.py +74 -0
  143. wandb/integration/metaflow/data_pytorch.py +75 -0
  144. wandb/integration/metaflow/data_sklearn.py +76 -0
  145. wandb/integration/metaflow/errors.py +13 -0
  146. wandb/integration/metaflow/metaflow.py +327 -0
  147. wandb/integration/openai/__init__.py +3 -0
  148. wandb/integration/openai/fine_tuning.py +480 -0
  149. wandb/integration/openai/openai.py +22 -0
  150. wandb/integration/openai/resolver.py +240 -0
  151. wandb/integration/prodigy/__init__.py +3 -0
  152. wandb/integration/prodigy/prodigy.py +291 -0
  153. wandb/integration/sacred/__init__.py +117 -0
  154. wandb/integration/sagemaker/__init__.py +14 -0
  155. wandb/integration/sagemaker/auth.py +29 -0
  156. wandb/integration/sagemaker/config.py +58 -0
  157. wandb/integration/sagemaker/files.py +2 -0
  158. wandb/integration/sagemaker/resources.py +63 -0
  159. wandb/integration/sb3/__init__.py +3 -0
  160. wandb/integration/sb3/sb3.py +147 -0
  161. wandb/integration/sklearn/__init__.py +37 -0
  162. wandb/integration/sklearn/calculate/__init__.py +32 -0
  163. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  164. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  165. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  166. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  167. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  168. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  169. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  170. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  171. wandb/integration/sklearn/calculate/residuals.py +86 -0
  172. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  173. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  174. wandb/integration/sklearn/plot/__init__.py +35 -0
  175. wandb/integration/sklearn/plot/classifier.py +329 -0
  176. wandb/integration/sklearn/plot/clusterer.py +146 -0
  177. wandb/integration/sklearn/plot/regressor.py +121 -0
  178. wandb/integration/sklearn/plot/shared.py +91 -0
  179. wandb/integration/sklearn/utils.py +184 -0
  180. wandb/integration/tensorboard/__init__.py +10 -0
  181. wandb/integration/tensorboard/log.py +351 -0
  182. wandb/integration/tensorboard/monkeypatch.py +186 -0
  183. wandb/integration/tensorflow/__init__.py +5 -0
  184. wandb/integration/tensorflow/estimator_hook.py +54 -0
  185. wandb/integration/torch/__init__.py +0 -0
  186. wandb/integration/torch/wandb_torch.py +554 -0
  187. wandb/integration/ultralytics/__init__.py +11 -0
  188. wandb/integration/ultralytics/bbox_utils.py +215 -0
  189. wandb/integration/ultralytics/callback.py +528 -0
  190. wandb/integration/ultralytics/classification_utils.py +83 -0
  191. wandb/integration/ultralytics/mask_utils.py +202 -0
  192. wandb/integration/ultralytics/pose_utils.py +103 -0
  193. wandb/integration/weave/__init__.py +6 -0
  194. wandb/integration/weave/interface.py +49 -0
  195. wandb/integration/weave/weave.py +118 -0
  196. wandb/integration/xgboost/__init__.py +11 -0
  197. wandb/integration/xgboost/xgboost.py +189 -0
  198. wandb/integration/yolov8/__init__.py +0 -0
  199. wandb/integration/yolov8/yolov8.py +284 -0
  200. wandb/jupyter.py +538 -0
  201. wandb/mpmain/__init__.py +0 -0
  202. wandb/mpmain/__main__.py +1 -0
  203. wandb/old/__init__.py +0 -0
  204. wandb/old/core.py +53 -0
  205. wandb/old/settings.py +176 -0
  206. wandb/old/summary.py +438 -0
  207. wandb/plot/__init__.py +30 -0
  208. wandb/plot/bar.py +71 -0
  209. wandb/plot/confusion_matrix.py +185 -0
  210. wandb/plot/custom_chart.py +147 -0
  211. wandb/plot/histogram.py +66 -0
  212. wandb/plot/line.py +75 -0
  213. wandb/plot/line_series.py +173 -0
  214. wandb/plot/pr_curve.py +186 -0
  215. wandb/plot/roc_curve.py +163 -0
  216. wandb/plot/scatter.py +66 -0
  217. wandb/plot/utils.py +184 -0
  218. wandb/plot/viz.py +41 -0
  219. wandb/proto/__init__.py +0 -0
  220. wandb/proto/v3/__init__.py +0 -0
  221. wandb/proto/v3/wandb_base_pb2.py +55 -0
  222. wandb/proto/v3/wandb_internal_pb2.py +1738 -0
  223. wandb/proto/v3/wandb_server_pb2.py +209 -0
  224. wandb/proto/v3/wandb_settings_pb2.py +122 -0
  225. wandb/proto/v3/wandb_sync_pb2.py +100 -0
  226. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  227. wandb/proto/v4/__init__.py +0 -0
  228. wandb/proto/v4/wandb_base_pb2.py +30 -0
  229. wandb/proto/v4/wandb_internal_pb2.py +384 -0
  230. wandb/proto/v4/wandb_server_pb2.py +64 -0
  231. wandb/proto/v4/wandb_settings_pb2.py +47 -0
  232. wandb/proto/v4/wandb_sync_pb2.py +42 -0
  233. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  234. wandb/proto/v5/wandb_base_pb2.py +31 -0
  235. wandb/proto/v5/wandb_internal_pb2.py +385 -0
  236. wandb/proto/v5/wandb_server_pb2.py +65 -0
  237. wandb/proto/v5/wandb_settings_pb2.py +48 -0
  238. wandb/proto/v5/wandb_sync_pb2.py +43 -0
  239. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  240. wandb/proto/v6/wandb_base_pb2.py +41 -0
  241. wandb/proto/v6/wandb_internal_pb2.py +395 -0
  242. wandb/proto/v6/wandb_server_pb2.py +75 -0
  243. wandb/proto/v6/wandb_settings_pb2.py +58 -0
  244. wandb/proto/v6/wandb_sync_pb2.py +53 -0
  245. wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
  246. wandb/proto/wandb_base_pb2.py +12 -0
  247. wandb/proto/wandb_deprecated.py +59 -0
  248. wandb/proto/wandb_generate_deprecated.py +30 -0
  249. wandb/proto/wandb_generate_proto.py +50 -0
  250. wandb/proto/wandb_internal_pb2.py +18 -0
  251. wandb/proto/wandb_server_pb2.py +12 -0
  252. wandb/proto/wandb_settings_pb2.py +12 -0
  253. wandb/proto/wandb_sync_pb2.py +12 -0
  254. wandb/proto/wandb_telemetry_pb2.py +12 -0
  255. wandb/py.typed +0 -0
  256. wandb/sdk/__init__.py +37 -0
  257. wandb/sdk/artifacts/__init__.py +0 -0
  258. wandb/sdk/artifacts/_factories.py +22 -0
  259. wandb/sdk/artifacts/_generated/__init__.py +208 -0
  260. wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
  261. wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
  262. wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
  263. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
  264. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
  265. wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
  266. wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
  267. wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
  268. wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
  269. wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
  270. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
  271. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
  272. wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
  273. wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
  274. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
  275. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
  276. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
  277. wandb/sdk/artifacts/_generated/enums.py +22 -0
  278. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
  279. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
  280. wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
  281. wandb/sdk/artifacts/_generated/fragments.py +524 -0
  282. wandb/sdk/artifacts/_generated/input_types.py +46 -0
  283. wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
  284. wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
  285. wandb/sdk/artifacts/_generated/operations.py +1253 -0
  286. wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
  287. wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
  288. wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
  289. wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
  290. wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
  291. wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
  292. wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
  293. wandb/sdk/artifacts/_generated/run_input_artifacts.py +31 -0
  294. wandb/sdk/artifacts/_generated/run_output_artifacts.py +31 -0
  295. wandb/sdk/artifacts/_generated/type_info.py +19 -0
  296. wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
  297. wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
  298. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
  299. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
  300. wandb/sdk/artifacts/_gqlutils.py +47 -0
  301. wandb/sdk/artifacts/_internal_artifact.py +54 -0
  302. wandb/sdk/artifacts/_models/__init__.py +4 -0
  303. wandb/sdk/artifacts/_models/base_model.py +20 -0
  304. wandb/sdk/artifacts/_validators.py +338 -0
  305. wandb/sdk/artifacts/artifact.py +2683 -0
  306. wandb/sdk/artifacts/artifact_download_logger.py +45 -0
  307. wandb/sdk/artifacts/artifact_file_cache.py +256 -0
  308. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  309. wandb/sdk/artifacts/artifact_manifest.py +76 -0
  310. wandb/sdk/artifacts/artifact_manifest_entry.py +315 -0
  311. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  312. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
  313. wandb/sdk/artifacts/artifact_saver.py +277 -0
  314. wandb/sdk/artifacts/artifact_state.py +13 -0
  315. wandb/sdk/artifacts/artifact_ttl.py +9 -0
  316. wandb/sdk/artifacts/exceptions.py +72 -0
  317. wandb/sdk/artifacts/staging.py +27 -0
  318. wandb/sdk/artifacts/storage_handler.py +62 -0
  319. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  320. wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
  321. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
  322. wandb/sdk/artifacts/storage_handlers/http_handler.py +112 -0
  323. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
  324. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  325. wandb/sdk/artifacts/storage_handlers/s3_handler.py +340 -0
  326. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
  327. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
  328. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  329. wandb/sdk/artifacts/storage_layout.py +8 -0
  330. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  331. wandb/sdk/artifacts/storage_policies/_factories.py +63 -0
  332. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  333. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +525 -0
  334. wandb/sdk/artifacts/storage_policy.py +75 -0
  335. wandb/sdk/backend/__init__.py +0 -0
  336. wandb/sdk/backend/backend.py +57 -0
  337. wandb/sdk/data_types/__init__.py +0 -0
  338. wandb/sdk/data_types/_dtypes.py +914 -0
  339. wandb/sdk/data_types/_private.py +10 -0
  340. wandb/sdk/data_types/audio.py +208 -0
  341. wandb/sdk/data_types/base_types/__init__.py +0 -0
  342. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  343. wandb/sdk/data_types/base_types/media.py +339 -0
  344. wandb/sdk/data_types/base_types/wb_value.py +295 -0
  345. wandb/sdk/data_types/bokeh.py +91 -0
  346. wandb/sdk/data_types/graph.py +439 -0
  347. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  348. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
  349. wandb/sdk/data_types/helper_types/classes.py +159 -0
  350. wandb/sdk/data_types/helper_types/image_mask.py +251 -0
  351. wandb/sdk/data_types/histogram.py +107 -0
  352. wandb/sdk/data_types/html.py +165 -0
  353. wandb/sdk/data_types/image.py +985 -0
  354. wandb/sdk/data_types/molecule.py +250 -0
  355. wandb/sdk/data_types/object_3d.py +495 -0
  356. wandb/sdk/data_types/plotly.py +95 -0
  357. wandb/sdk/data_types/saved_model.py +435 -0
  358. wandb/sdk/data_types/table.py +1468 -0
  359. wandb/sdk/data_types/table_decorators.py +108 -0
  360. wandb/sdk/data_types/trace_tree.py +440 -0
  361. wandb/sdk/data_types/utils.py +260 -0
  362. wandb/sdk/data_types/video.py +303 -0
  363. wandb/sdk/integration_utils/__init__.py +0 -0
  364. wandb/sdk/integration_utils/auto_logging.py +232 -0
  365. wandb/sdk/integration_utils/data_logging.py +475 -0
  366. wandb/sdk/interface/__init__.py +0 -0
  367. wandb/sdk/interface/constants.py +4 -0
  368. wandb/sdk/interface/interface.py +1093 -0
  369. wandb/sdk/interface/interface_queue.py +50 -0
  370. wandb/sdk/interface/interface_shared.py +473 -0
  371. wandb/sdk/interface/interface_sock.py +55 -0
  372. wandb/sdk/interface/summary_record.py +67 -0
  373. wandb/sdk/internal/__init__.py +0 -0
  374. wandb/sdk/internal/_generated/__init__.py +5 -0
  375. wandb/sdk/internal/_generated/enums.py +4 -0
  376. wandb/sdk/internal/_generated/input_types.py +4 -0
  377. wandb/sdk/internal/_generated/operations.py +15 -0
  378. wandb/sdk/internal/_generated/server_features_query.py +27 -0
  379. wandb/sdk/internal/context.py +89 -0
  380. wandb/sdk/internal/datastore.py +293 -0
  381. wandb/sdk/internal/file_pusher.py +177 -0
  382. wandb/sdk/internal/file_stream.py +686 -0
  383. wandb/sdk/internal/handler.py +854 -0
  384. wandb/sdk/internal/incremental_table_util.py +53 -0
  385. wandb/sdk/internal/internal_api.py +4723 -0
  386. wandb/sdk/internal/job_builder.py +639 -0
  387. wandb/sdk/internal/profiler.py +79 -0
  388. wandb/sdk/internal/progress.py +77 -0
  389. wandb/sdk/internal/run.py +27 -0
  390. wandb/sdk/internal/sample.py +70 -0
  391. wandb/sdk/internal/sender.py +1692 -0
  392. wandb/sdk/internal/sender_config.py +203 -0
  393. wandb/sdk/internal/settings_static.py +40 -0
  394. wandb/sdk/internal/tb_watcher.py +519 -0
  395. wandb/sdk/internal/thread_local_settings.py +18 -0
  396. wandb/sdk/launch/__init__.py +15 -0
  397. wandb/sdk/launch/_launch.py +331 -0
  398. wandb/sdk/launch/_launch_add.py +255 -0
  399. wandb/sdk/launch/_project_spec.py +565 -0
  400. wandb/sdk/launch/agent/__init__.py +5 -0
  401. wandb/sdk/launch/agent/agent.py +931 -0
  402. wandb/sdk/launch/agent/config.py +296 -0
  403. wandb/sdk/launch/agent/job_status_tracker.py +55 -0
  404. wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
  405. wandb/sdk/launch/builder/__init__.py +0 -0
  406. wandb/sdk/launch/builder/abstract.py +156 -0
  407. wandb/sdk/launch/builder/build.py +296 -0
  408. wandb/sdk/launch/builder/context_manager.py +235 -0
  409. wandb/sdk/launch/builder/docker_builder.py +177 -0
  410. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  411. wandb/sdk/launch/builder/noop.py +58 -0
  412. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  413. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  414. wandb/sdk/launch/create_job.py +541 -0
  415. wandb/sdk/launch/environment/abstract.py +29 -0
  416. wandb/sdk/launch/environment/aws_environment.py +322 -0
  417. wandb/sdk/launch/environment/azure_environment.py +105 -0
  418. wandb/sdk/launch/environment/gcp_environment.py +334 -0
  419. wandb/sdk/launch/environment/local_environment.py +65 -0
  420. wandb/sdk/launch/errors.py +13 -0
  421. wandb/sdk/launch/git_reference.py +109 -0
  422. wandb/sdk/launch/inputs/files.py +148 -0
  423. wandb/sdk/launch/inputs/internal.py +315 -0
  424. wandb/sdk/launch/inputs/manage.py +113 -0
  425. wandb/sdk/launch/inputs/schema.py +70 -0
  426. wandb/sdk/launch/loader.py +249 -0
  427. wandb/sdk/launch/registry/abstract.py +48 -0
  428. wandb/sdk/launch/registry/anon.py +29 -0
  429. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  430. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  431. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  432. wandb/sdk/launch/registry/local_registry.py +65 -0
  433. wandb/sdk/launch/runner/__init__.py +0 -0
  434. wandb/sdk/launch/runner/abstract.py +185 -0
  435. wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
  436. wandb/sdk/launch/runner/kubernetes_runner.py +1290 -0
  437. wandb/sdk/launch/runner/local_container.py +301 -0
  438. wandb/sdk/launch/runner/local_process.py +78 -0
  439. wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
  440. wandb/sdk/launch/runner/vertex_runner.py +225 -0
  441. wandb/sdk/launch/sweeps/__init__.py +37 -0
  442. wandb/sdk/launch/sweeps/scheduler.py +739 -0
  443. wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
  444. wandb/sdk/launch/sweeps/utils.py +324 -0
  445. wandb/sdk/launch/utils.py +827 -0
  446. wandb/sdk/launch/wandb_reference.py +138 -0
  447. wandb/sdk/lib/__init__.py +5 -0
  448. wandb/sdk/lib/apikey.py +334 -0
  449. wandb/sdk/lib/asyncio_compat.py +278 -0
  450. wandb/sdk/lib/asyncio_manager.py +252 -0
  451. wandb/sdk/lib/capped_dict.py +26 -0
  452. wandb/sdk/lib/config_util.py +101 -0
  453. wandb/sdk/lib/console_capture.py +219 -0
  454. wandb/sdk/lib/credentials.py +141 -0
  455. wandb/sdk/lib/deprecate.py +27 -0
  456. wandb/sdk/lib/disabled.py +30 -0
  457. wandb/sdk/lib/exit_hooks.py +54 -0
  458. wandb/sdk/lib/file_stream_utils.py +118 -0
  459. wandb/sdk/lib/filenames.py +64 -0
  460. wandb/sdk/lib/filesystem.py +372 -0
  461. wandb/sdk/lib/fsm.py +165 -0
  462. wandb/sdk/lib/gitlib.py +240 -0
  463. wandb/sdk/lib/gql_request.py +76 -0
  464. wandb/sdk/lib/handler_util.py +21 -0
  465. wandb/sdk/lib/hashutil.py +106 -0
  466. wandb/sdk/lib/import_hooks.py +275 -0
  467. wandb/sdk/lib/interrupt.py +37 -0
  468. wandb/sdk/lib/ipython.py +126 -0
  469. wandb/sdk/lib/json_util.py +75 -0
  470. wandb/sdk/lib/lazyloader.py +63 -0
  471. wandb/sdk/lib/module.py +72 -0
  472. wandb/sdk/lib/paths.py +108 -0
  473. wandb/sdk/lib/preinit.py +42 -0
  474. wandb/sdk/lib/printer.py +567 -0
  475. wandb/sdk/lib/printer_asyncio.py +48 -0
  476. wandb/sdk/lib/progress.py +325 -0
  477. wandb/sdk/lib/proto_util.py +90 -0
  478. wandb/sdk/lib/redirect.py +876 -0
  479. wandb/sdk/lib/retry.py +395 -0
  480. wandb/sdk/lib/run_moment.py +82 -0
  481. wandb/sdk/lib/runid.py +12 -0
  482. wandb/sdk/lib/server.py +58 -0
  483. wandb/sdk/lib/service/ipc_support.py +13 -0
  484. wandb/sdk/lib/service/service_client.py +102 -0
  485. wandb/sdk/lib/service/service_connection.py +238 -0
  486. wandb/sdk/lib/service/service_port_file.py +105 -0
  487. wandb/sdk/lib/service/service_process.py +111 -0
  488. wandb/sdk/lib/service/service_token.py +181 -0
  489. wandb/sdk/lib/sparkline.py +44 -0
  490. wandb/sdk/lib/telemetry.py +100 -0
  491. wandb/sdk/lib/timed_input.py +133 -0
  492. wandb/sdk/lib/timer.py +19 -0
  493. wandb/sdk/lib/wb_logging.py +161 -0
  494. wandb/sdk/mailbox/__init__.py +23 -0
  495. wandb/sdk/mailbox/mailbox.py +143 -0
  496. wandb/sdk/mailbox/mailbox_handle.py +134 -0
  497. wandb/sdk/mailbox/response_handle.py +99 -0
  498. wandb/sdk/mailbox/wait_with_progress.py +100 -0
  499. wandb/sdk/projects/_generated/__init__.py +26 -0
  500. wandb/sdk/projects/_generated/delete_project.py +22 -0
  501. wandb/sdk/projects/_generated/enums.py +4 -0
  502. wandb/sdk/projects/_generated/fetch_registry.py +22 -0
  503. wandb/sdk/projects/_generated/fragments.py +41 -0
  504. wandb/sdk/projects/_generated/input_types.py +13 -0
  505. wandb/sdk/projects/_generated/operations.py +88 -0
  506. wandb/sdk/projects/_generated/rename_project.py +27 -0
  507. wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
  508. wandb/sdk/verify/__init__.py +0 -0
  509. wandb/sdk/verify/verify.py +555 -0
  510. wandb/sdk/wandb_alerts.py +12 -0
  511. wandb/sdk/wandb_config.py +323 -0
  512. wandb/sdk/wandb_helper.py +54 -0
  513. wandb/sdk/wandb_init.py +1601 -0
  514. wandb/sdk/wandb_login.py +358 -0
  515. wandb/sdk/wandb_metric.py +112 -0
  516. wandb/sdk/wandb_require.py +88 -0
  517. wandb/sdk/wandb_require_helpers.py +44 -0
  518. wandb/sdk/wandb_run.py +4102 -0
  519. wandb/sdk/wandb_settings.py +2197 -0
  520. wandb/sdk/wandb_setup.py +560 -0
  521. wandb/sdk/wandb_summary.py +150 -0
  522. wandb/sdk/wandb_sweep.py +120 -0
  523. wandb/sdk/wandb_sync.py +71 -0
  524. wandb/sdk/wandb_watch.py +146 -0
  525. wandb/sklearn.py +35 -0
  526. wandb/sync/__init__.py +3 -0
  527. wandb/sync/sync.py +457 -0
  528. wandb/trigger.py +29 -0
  529. wandb/util.py +2040 -0
  530. wandb/vendor/__init__.py +0 -0
  531. wandb/vendor/gql-0.2.0/setup.py +40 -0
  532. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  533. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  534. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  535. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  536. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  537. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  538. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  539. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  540. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  541. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  542. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  543. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  544. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  545. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  546. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  547. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  548. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  549. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  550. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  555. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  556. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  557. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  558. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  559. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  560. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  561. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  562. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  563. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  564. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  565. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  566. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  567. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  568. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  569. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  570. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  571. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  572. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  573. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  574. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  575. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  576. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  577. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  578. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  579. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  580. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  581. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  582. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  583. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  584. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  585. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  586. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  587. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  588. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  589. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  590. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  591. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  592. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  593. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  594. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  595. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  596. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  597. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  598. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  599. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  600. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  601. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  602. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  603. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  604. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  605. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  606. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  607. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  608. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  609. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  610. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  611. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  612. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  613. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  614. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  615. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  616. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  617. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  618. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  619. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  620. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  621. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  622. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  623. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  624. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  625. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  626. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  627. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  628. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  629. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  630. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  631. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  632. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  633. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  634. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  635. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  636. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  637. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  638. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  639. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  640. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  641. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  642. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  643. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  644. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  645. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  646. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  647. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  648. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  649. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  650. wandb/vendor/promise-2.3.0/setup.py +64 -0
  651. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  652. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  653. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  654. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  655. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  656. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  657. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  658. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  659. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  660. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  661. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  662. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  663. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  664. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  665. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  666. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  667. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  668. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  669. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  670. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  671. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  672. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  673. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  674. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  675. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  676. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  677. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  678. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  679. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  680. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  681. wandb/vendor/pygments/__init__.py +90 -0
  682. wandb/vendor/pygments/cmdline.py +568 -0
  683. wandb/vendor/pygments/console.py +74 -0
  684. wandb/vendor/pygments/filter.py +74 -0
  685. wandb/vendor/pygments/filters/__init__.py +350 -0
  686. wandb/vendor/pygments/formatter.py +95 -0
  687. wandb/vendor/pygments/formatters/__init__.py +153 -0
  688. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  689. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  690. wandb/vendor/pygments/formatters/html.py +851 -0
  691. wandb/vendor/pygments/formatters/img.py +600 -0
  692. wandb/vendor/pygments/formatters/irc.py +182 -0
  693. wandb/vendor/pygments/formatters/latex.py +482 -0
  694. wandb/vendor/pygments/formatters/other.py +160 -0
  695. wandb/vendor/pygments/formatters/rtf.py +147 -0
  696. wandb/vendor/pygments/formatters/svg.py +153 -0
  697. wandb/vendor/pygments/formatters/terminal.py +136 -0
  698. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  699. wandb/vendor/pygments/lexer.py +871 -0
  700. wandb/vendor/pygments/lexers/__init__.py +329 -0
  701. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  702. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  703. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  704. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  705. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  706. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  707. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  708. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  709. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  710. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  711. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  712. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  713. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  714. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  715. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  716. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  717. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  718. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  719. wandb/vendor/pygments/lexers/agile.py +24 -0
  720. wandb/vendor/pygments/lexers/algebra.py +221 -0
  721. wandb/vendor/pygments/lexers/ambient.py +76 -0
  722. wandb/vendor/pygments/lexers/ampl.py +87 -0
  723. wandb/vendor/pygments/lexers/apl.py +101 -0
  724. wandb/vendor/pygments/lexers/archetype.py +318 -0
  725. wandb/vendor/pygments/lexers/asm.py +641 -0
  726. wandb/vendor/pygments/lexers/automation.py +374 -0
  727. wandb/vendor/pygments/lexers/basic.py +500 -0
  728. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  729. wandb/vendor/pygments/lexers/business.py +612 -0
  730. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  731. wandb/vendor/pygments/lexers/c_like.py +541 -0
  732. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  733. wandb/vendor/pygments/lexers/chapel.py +102 -0
  734. wandb/vendor/pygments/lexers/clean.py +288 -0
  735. wandb/vendor/pygments/lexers/compiled.py +34 -0
  736. wandb/vendor/pygments/lexers/configs.py +833 -0
  737. wandb/vendor/pygments/lexers/console.py +114 -0
  738. wandb/vendor/pygments/lexers/crystal.py +393 -0
  739. wandb/vendor/pygments/lexers/csound.py +366 -0
  740. wandb/vendor/pygments/lexers/css.py +689 -0
  741. wandb/vendor/pygments/lexers/d.py +251 -0
  742. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  743. wandb/vendor/pygments/lexers/data.py +555 -0
  744. wandb/vendor/pygments/lexers/diff.py +165 -0
  745. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  746. wandb/vendor/pygments/lexers/dsls.py +878 -0
  747. wandb/vendor/pygments/lexers/dylan.py +289 -0
  748. wandb/vendor/pygments/lexers/ecl.py +125 -0
  749. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  750. wandb/vendor/pygments/lexers/elm.py +121 -0
  751. wandb/vendor/pygments/lexers/erlang.py +533 -0
  752. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  753. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  754. wandb/vendor/pygments/lexers/factor.py +344 -0
  755. wandb/vendor/pygments/lexers/fantom.py +250 -0
  756. wandb/vendor/pygments/lexers/felix.py +273 -0
  757. wandb/vendor/pygments/lexers/forth.py +177 -0
  758. wandb/vendor/pygments/lexers/fortran.py +205 -0
  759. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  760. wandb/vendor/pygments/lexers/functional.py +21 -0
  761. wandb/vendor/pygments/lexers/go.py +101 -0
  762. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  763. wandb/vendor/pygments/lexers/graph.py +80 -0
  764. wandb/vendor/pygments/lexers/graphics.py +553 -0
  765. wandb/vendor/pygments/lexers/haskell.py +843 -0
  766. wandb/vendor/pygments/lexers/haxe.py +936 -0
  767. wandb/vendor/pygments/lexers/hdl.py +382 -0
  768. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  769. wandb/vendor/pygments/lexers/html.py +602 -0
  770. wandb/vendor/pygments/lexers/idl.py +270 -0
  771. wandb/vendor/pygments/lexers/igor.py +288 -0
  772. wandb/vendor/pygments/lexers/inferno.py +96 -0
  773. wandb/vendor/pygments/lexers/installers.py +322 -0
  774. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  775. wandb/vendor/pygments/lexers/iolang.py +63 -0
  776. wandb/vendor/pygments/lexers/j.py +146 -0
  777. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  778. wandb/vendor/pygments/lexers/julia.py +333 -0
  779. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  780. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  781. wandb/vendor/pygments/lexers/make.py +202 -0
  782. wandb/vendor/pygments/lexers/markup.py +595 -0
  783. wandb/vendor/pygments/lexers/math.py +21 -0
  784. wandb/vendor/pygments/lexers/matlab.py +663 -0
  785. wandb/vendor/pygments/lexers/ml.py +769 -0
  786. wandb/vendor/pygments/lexers/modeling.py +358 -0
  787. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  788. wandb/vendor/pygments/lexers/monte.py +204 -0
  789. wandb/vendor/pygments/lexers/ncl.py +894 -0
  790. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  791. wandb/vendor/pygments/lexers/nit.py +64 -0
  792. wandb/vendor/pygments/lexers/nix.py +136 -0
  793. wandb/vendor/pygments/lexers/oberon.py +105 -0
  794. wandb/vendor/pygments/lexers/objective.py +504 -0
  795. wandb/vendor/pygments/lexers/ooc.py +85 -0
  796. wandb/vendor/pygments/lexers/other.py +41 -0
  797. wandb/vendor/pygments/lexers/parasail.py +79 -0
  798. wandb/vendor/pygments/lexers/parsers.py +835 -0
  799. wandb/vendor/pygments/lexers/pascal.py +644 -0
  800. wandb/vendor/pygments/lexers/pawn.py +199 -0
  801. wandb/vendor/pygments/lexers/perl.py +620 -0
  802. wandb/vendor/pygments/lexers/php.py +267 -0
  803. wandb/vendor/pygments/lexers/praat.py +294 -0
  804. wandb/vendor/pygments/lexers/prolog.py +306 -0
  805. wandb/vendor/pygments/lexers/python.py +939 -0
  806. wandb/vendor/pygments/lexers/qvt.py +152 -0
  807. wandb/vendor/pygments/lexers/r.py +453 -0
  808. wandb/vendor/pygments/lexers/rdf.py +270 -0
  809. wandb/vendor/pygments/lexers/rebol.py +431 -0
  810. wandb/vendor/pygments/lexers/resource.py +85 -0
  811. wandb/vendor/pygments/lexers/rnc.py +67 -0
  812. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  813. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  814. wandb/vendor/pygments/lexers/ruby.py +519 -0
  815. wandb/vendor/pygments/lexers/rust.py +220 -0
  816. wandb/vendor/pygments/lexers/sas.py +228 -0
  817. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  818. wandb/vendor/pygments/lexers/shell.py +794 -0
  819. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  820. wandb/vendor/pygments/lexers/smv.py +79 -0
  821. wandb/vendor/pygments/lexers/snobol.py +83 -0
  822. wandb/vendor/pygments/lexers/special.py +103 -0
  823. wandb/vendor/pygments/lexers/sql.py +681 -0
  824. wandb/vendor/pygments/lexers/stata.py +108 -0
  825. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  826. wandb/vendor/pygments/lexers/tcl.py +145 -0
  827. wandb/vendor/pygments/lexers/templates.py +2283 -0
  828. wandb/vendor/pygments/lexers/testing.py +207 -0
  829. wandb/vendor/pygments/lexers/text.py +25 -0
  830. wandb/vendor/pygments/lexers/textedit.py +169 -0
  831. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  832. wandb/vendor/pygments/lexers/theorem.py +458 -0
  833. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  834. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  835. wandb/vendor/pygments/lexers/urbi.py +133 -0
  836. wandb/vendor/pygments/lexers/varnish.py +190 -0
  837. wandb/vendor/pygments/lexers/verification.py +111 -0
  838. wandb/vendor/pygments/lexers/web.py +24 -0
  839. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  840. wandb/vendor/pygments/lexers/whiley.py +116 -0
  841. wandb/vendor/pygments/lexers/x10.py +69 -0
  842. wandb/vendor/pygments/modeline.py +44 -0
  843. wandb/vendor/pygments/plugin.py +68 -0
  844. wandb/vendor/pygments/regexopt.py +92 -0
  845. wandb/vendor/pygments/scanner.py +105 -0
  846. wandb/vendor/pygments/sphinxext.py +158 -0
  847. wandb/vendor/pygments/style.py +155 -0
  848. wandb/vendor/pygments/styles/__init__.py +80 -0
  849. wandb/vendor/pygments/styles/abap.py +29 -0
  850. wandb/vendor/pygments/styles/algol.py +63 -0
  851. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  852. wandb/vendor/pygments/styles/arduino.py +98 -0
  853. wandb/vendor/pygments/styles/autumn.py +65 -0
  854. wandb/vendor/pygments/styles/borland.py +51 -0
  855. wandb/vendor/pygments/styles/bw.py +49 -0
  856. wandb/vendor/pygments/styles/colorful.py +81 -0
  857. wandb/vendor/pygments/styles/default.py +73 -0
  858. wandb/vendor/pygments/styles/emacs.py +72 -0
  859. wandb/vendor/pygments/styles/friendly.py +72 -0
  860. wandb/vendor/pygments/styles/fruity.py +42 -0
  861. wandb/vendor/pygments/styles/igor.py +29 -0
  862. wandb/vendor/pygments/styles/lovelace.py +97 -0
  863. wandb/vendor/pygments/styles/manni.py +75 -0
  864. wandb/vendor/pygments/styles/monokai.py +106 -0
  865. wandb/vendor/pygments/styles/murphy.py +80 -0
  866. wandb/vendor/pygments/styles/native.py +65 -0
  867. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  868. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  869. wandb/vendor/pygments/styles/pastie.py +75 -0
  870. wandb/vendor/pygments/styles/perldoc.py +69 -0
  871. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  872. wandb/vendor/pygments/styles/rrt.py +33 -0
  873. wandb/vendor/pygments/styles/sas.py +44 -0
  874. wandb/vendor/pygments/styles/stata.py +40 -0
  875. wandb/vendor/pygments/styles/tango.py +141 -0
  876. wandb/vendor/pygments/styles/trac.py +63 -0
  877. wandb/vendor/pygments/styles/vim.py +63 -0
  878. wandb/vendor/pygments/styles/vs.py +38 -0
  879. wandb/vendor/pygments/styles/xcode.py +51 -0
  880. wandb/vendor/pygments/token.py +213 -0
  881. wandb/vendor/pygments/unistring.py +217 -0
  882. wandb/vendor/pygments/util.py +388 -0
  883. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  884. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  885. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  886. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  887. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  888. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  889. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  890. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  891. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  892. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  893. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  894. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  895. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  896. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  897. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  898. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  899. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  900. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  901. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  902. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  903. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  904. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  905. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  906. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  907. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  908. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  909. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  910. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  911. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  912. wandb/wandb_agent.py +611 -0
  913. wandb/wandb_controller.py +719 -0
  914. wandb/wandb_run.py +8 -0
  915. wandb-0.22.1.dist-info/METADATA +223 -0
  916. wandb-0.22.1.dist-info/RECORD +919 -0
  917. wandb-0.22.1.dist-info/WHEEL +4 -0
  918. wandb-0.22.1.dist-info/entry_points.txt +3 -0
  919. wandb-0.22.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1438 @@
1
+ """W&B Public API for Runs.
2
+
3
+ This module provides classes for interacting with W&B runs and their associated
4
+ data.
5
+
6
+ Example:
7
+ ```python
8
+ from wandb.apis.public import Api
9
+
10
+ # Get runs matching filters
11
+ runs = Api().runs(
12
+ path="entity/project", filters={"state": "finished", "config.batch_size": 32}
13
+ )
14
+
15
+ # Access run data
16
+ for run in runs:
17
+ print(f"Run: {run.name}")
18
+ print(f"Config: {run.config}")
19
+ print(f"Metrics: {run.summary}")
20
+
21
+ # Get history with pandas
22
+ history_df = run.history(keys=["loss", "accuracy"], pandas=True)
23
+
24
+ # Work with artifacts
25
+ for artifact in run.logged_artifacts():
26
+ print(f"Artifact: {artifact.name}")
27
+ ```
28
+
29
+ Note:
30
+ This module is part of the W&B Public API and provides read/write access
31
+ to run data. For logging new runs, use the wandb.init() function from
32
+ the main wandb package.
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import json
38
+ import os
39
+ import tempfile
40
+ import time
41
+ import urllib
42
+ from typing import TYPE_CHECKING, Any, Collection, Literal, Mapping
43
+
44
+ from wandb_gql import gql
45
+
46
+ import wandb
47
+ from wandb import env, util
48
+ from wandb.apis import public
49
+ from wandb.apis.attrs import Attrs
50
+ from wandb.apis.internal import Api as InternalApi
51
+ from wandb.apis.normalize import normalize_exceptions
52
+ from wandb.apis.paginator import SizedPaginator
53
+ from wandb.apis.public.const import RETRY_TIMEDELTA
54
+ from wandb.sdk.lib import ipython, json_util, runid
55
+ from wandb.sdk.lib.paths import LogicalPath
56
+
57
+ if TYPE_CHECKING:
58
+ from wandb.apis.public import RetryingClient
59
+
60
+ WANDB_INTERNAL_KEYS = {"_wandb", "wandb_version"}
61
+
62
+ RUN_FRAGMENT = """fragment RunFragment on Run {
63
+ id
64
+ tags
65
+ name
66
+ displayName
67
+ sweepName
68
+ state
69
+ config
70
+ group
71
+ jobType
72
+ commit
73
+ readOnly
74
+ createdAt
75
+ heartbeatAt
76
+ description
77
+ notes
78
+ systemMetrics
79
+ summaryMetrics
80
+ historyLineCount
81
+ user {
82
+ name
83
+ username
84
+ }
85
+ historyKeys
86
+ }"""
87
+
88
+ # Lightweight fragment for listing operations - excludes heavy fields
89
+ LIGHTWEIGHT_RUN_FRAGMENT = """fragment LightweightRunFragment on Run {
90
+ id
91
+ tags
92
+ name
93
+ displayName
94
+ sweepName
95
+ state
96
+ group
97
+ jobType
98
+ commit
99
+ readOnly
100
+ createdAt
101
+ heartbeatAt
102
+ description
103
+ notes
104
+ historyLineCount
105
+ user {
106
+ name
107
+ username
108
+ }
109
+ }"""
110
+
111
+ # Fragment name constants to avoid string parsing
112
+ RUN_FRAGMENT_NAME = "RunFragment"
113
+ LIGHTWEIGHT_RUN_FRAGMENT_NAME = "LightweightRunFragment"
114
+
115
+
116
+ def _create_runs_query(
117
+ *, lazy: bool, with_internal_id: bool, with_project_id: bool
118
+ ) -> gql:
119
+ """Create GraphQL query for runs with appropriate fragment."""
120
+ fragment = LIGHTWEIGHT_RUN_FRAGMENT if lazy else RUN_FRAGMENT
121
+ fragment_name = LIGHTWEIGHT_RUN_FRAGMENT_NAME if lazy else RUN_FRAGMENT_NAME
122
+
123
+ return gql(
124
+ f"""#graphql
125
+ query Runs($project: String!, $entity: String!, $cursor: String, $perPage: Int = 50, $order: String, $filters: JSONString) {{
126
+ project(name: $project, entityName: $entity) {{
127
+ {"internalId" if with_internal_id else ""}
128
+ runCount(filters: $filters)
129
+ readOnly
130
+ runs(filters: $filters, after: $cursor, first: $perPage, order: $order) {{
131
+ edges {{
132
+ node {{
133
+ {"projectId" if with_project_id else ""}
134
+ ...{fragment_name}
135
+ }}
136
+ cursor
137
+ }}
138
+ pageInfo {{
139
+ endCursor
140
+ hasNextPage
141
+ }}
142
+ }}
143
+ }}
144
+ }}
145
+ {fragment}
146
+ """
147
+ )
148
+
149
+
150
+ @normalize_exceptions
151
+ def _server_provides_internal_id_for_project(client) -> bool:
152
+ """Returns True if the server allows us to query the internalId field for a project."""
153
+ query_string = """
154
+ query ProbeProjectInput {
155
+ ProjectType: __type(name:"Project") {
156
+ fields {
157
+ name
158
+ }
159
+ }
160
+ }
161
+ """
162
+
163
+ # Only perform the query once to avoid extra network calls
164
+ query = gql(query_string)
165
+ res = client.execute(query)
166
+ return "internalId" in [
167
+ x["name"] for x in (res.get("ProjectType", {}).get("fields", [{}]))
168
+ ]
169
+
170
+
171
+ @normalize_exceptions
172
+ def _server_provides_project_id_for_run(client) -> bool:
173
+ """Returns True if the server allows us to query the projectId field for a run."""
174
+ query_string = """
175
+ query ProbeRunInput {
176
+ RunType: __type(name:"Run") {
177
+ fields {
178
+ name
179
+ }
180
+ }
181
+ }
182
+ """
183
+
184
+ # Only perform the query once to avoid extra network calls
185
+ query = gql(query_string)
186
+ res = client.execute(query)
187
+ return "projectId" in [
188
+ x["name"] for x in (res.get("RunType", {}).get("fields", [{}]))
189
+ ]
190
+
191
+
192
+ @normalize_exceptions
193
+ def _convert_to_dict(value: Any) -> dict[str, Any]:
194
+ """Converts a value to a dictionary.
195
+
196
+ If the value is already a dictionary, the value is returned unchanged.
197
+ If the value is a string, bytes, or bytearray, it is parsed as JSON.
198
+ For any other type, a TypeError is raised.
199
+ """
200
+ if value is None:
201
+ return {}
202
+
203
+ if isinstance(value, dict):
204
+ return value
205
+
206
+ if isinstance(value, (str, bytes, bytearray)):
207
+ try:
208
+ return json.loads(value)
209
+ except json.decoder.JSONDecodeError:
210
+ # ignore invalid utf-8 or control characters
211
+ return json.loads(value, strict=False)
212
+
213
+ raise TypeError(f"Unable to convert {value} to a dict")
214
+
215
+
216
+ class Runs(SizedPaginator["Run"]):
217
+ """A lazy iterator of `Run` objects associated with a project and optional filter.
218
+
219
+ Runs are retrieved in pages from the W&B server as needed.
220
+
221
+ This is generally used indirectly using the `Api.runs` namespace.
222
+
223
+ Args:
224
+ client: (`wandb.apis.public.RetryingClient`) The API client to use
225
+ for requests.
226
+ entity: (str) The entity (username or team) that owns the project.
227
+ project: (str) The name of the project to fetch runs from.
228
+ filters: (Optional[Dict[str, Any]]) A dictionary of filters to apply
229
+ to the runs query.
230
+ order: (str) Order can be `created_at`, `heartbeat_at`, `config.*.value`, or `summary_metrics.*`.
231
+ If you prepend order with a + order is ascending (default).
232
+ If you prepend order with a - order is descending.
233
+ The default order is run.created_at from oldest to newest.
234
+ per_page: (int) The number of runs to fetch per request (default is 50).
235
+ include_sweeps: (bool) Whether to include sweep information in the
236
+ runs. Defaults to True.
237
+
238
+ Examples:
239
+ ```python
240
+ from wandb.apis.public.runs import Runs
241
+ from wandb.apis.public import Api
242
+
243
+ # Get all runs from a project that satisfy the filters
244
+ filters = {"state": "finished", "config.optimizer": "adam"}
245
+
246
+ runs = Api().runs(
247
+ client=api.client,
248
+ entity="entity",
249
+ project="project_name",
250
+ filters=filters,
251
+ )
252
+
253
+ # Iterate over runs and print details
254
+ for run in runs:
255
+ print(f"Run name: {run.name}")
256
+ print(f"Run ID: {run.id}")
257
+ print(f"Run URL: {run.url}")
258
+ print(f"Run state: {run.state}")
259
+ print(f"Run config: {run.config}")
260
+ print(f"Run summary: {run.summary}")
261
+ print(f"Run history (samples=5): {run.history(samples=5)}")
262
+ print("----------")
263
+
264
+ # Get histories for all runs with specific metrics
265
+ histories_df = runs.histories(
266
+ samples=100, # Number of samples per run
267
+ keys=["loss", "accuracy"], # Metrics to fetch
268
+ x_axis="_step", # X-axis metric
269
+ format="pandas", # Return as pandas DataFrame
270
+ )
271
+ ```
272
+ """
273
+
274
+ def __init__(
275
+ self,
276
+ client: RetryingClient,
277
+ entity: str,
278
+ project: str,
279
+ filters: dict[str, Any] | None = None,
280
+ order: str = "+created_at",
281
+ per_page: int = 50,
282
+ include_sweeps: bool = True,
283
+ lazy: bool = True,
284
+ ):
285
+ if not order:
286
+ order = "+created_at"
287
+
288
+ self.QUERY = _create_runs_query(
289
+ lazy=lazy,
290
+ with_internal_id=_server_provides_internal_id_for_project(client),
291
+ with_project_id=_server_provides_project_id_for_run(client),
292
+ )
293
+
294
+ self.entity = entity
295
+ self.project = project
296
+ self._project_internal_id = None
297
+ self.filters = filters or {}
298
+ self.order = order
299
+ self._sweeps = {}
300
+ self._include_sweeps = include_sweeps
301
+ self._lazy = lazy
302
+ variables = {
303
+ "project": self.project,
304
+ "entity": self.entity,
305
+ "order": self.order,
306
+ "filters": json.dumps(self.filters),
307
+ }
308
+ super().__init__(client, variables, per_page)
309
+
310
+ @property
311
+ def _length(self):
312
+ """Returns the total number of runs.
313
+
314
+ <!-- lazydoc-ignore: internal -->
315
+ """
316
+ if not self.last_response:
317
+ self._load_page()
318
+ return self.last_response["project"]["runCount"]
319
+
320
+ @property
321
+ def more(self) -> bool:
322
+ """Returns whether there are more runs to fetch.
323
+
324
+ <!-- lazydoc-ignore: internal -->
325
+ """
326
+ if self.last_response:
327
+ return bool(
328
+ self.last_response["project"]["runs"]["pageInfo"]["hasNextPage"]
329
+ )
330
+ else:
331
+ return True
332
+
333
+ @property
334
+ def cursor(self):
335
+ """Returns the cursor position for pagination of runs results.
336
+
337
+ <!-- lazydoc-ignore: internal -->
338
+ """
339
+ if self.last_response:
340
+ return self.last_response["project"]["runs"]["edges"][-1]["cursor"]
341
+ else:
342
+ return None
343
+
344
+ def convert_objects(self):
345
+ """Converts GraphQL edges to Runs objects.
346
+
347
+ <!-- lazydoc-ignore: internal -->
348
+ """
349
+ objs = []
350
+ if self.last_response is None or self.last_response.get("project") is None:
351
+ raise ValueError("Could not find project {}".format(self.project))
352
+ for run_response in self.last_response["project"]["runs"]["edges"]:
353
+ run = Run(
354
+ self.client,
355
+ self.entity,
356
+ self.project,
357
+ run_response["node"]["name"],
358
+ run_response["node"],
359
+ include_sweeps=self._include_sweeps,
360
+ lazy=self._lazy,
361
+ )
362
+ objs.append(run)
363
+
364
+ if self._include_sweeps and run.sweep_name:
365
+ if run.sweep_name in self._sweeps:
366
+ sweep = self._sweeps[run.sweep_name]
367
+ else:
368
+ sweep = public.Sweep.get(
369
+ self.client,
370
+ self.entity,
371
+ self.project,
372
+ run.sweep_name,
373
+ withRuns=False,
374
+ )
375
+ self._sweeps[run.sweep_name] = sweep
376
+
377
+ if sweep is None:
378
+ continue
379
+ run.sweep = sweep
380
+
381
+ return objs
382
+
383
+ @normalize_exceptions
384
+ def histories(
385
+ self,
386
+ samples: int = 500,
387
+ keys: list[str] | None = None,
388
+ x_axis: str = "_step",
389
+ format: Literal["default", "pandas", "polars"] = "default",
390
+ stream: Literal["default", "system"] = "default",
391
+ ):
392
+ """Return sampled history metrics for all runs that fit the filters conditions.
393
+
394
+ Args:
395
+ samples: The number of samples to return per run
396
+ keys: Only return metrics for specific keys
397
+ x_axis: Use this metric as the xAxis defaults to _step
398
+ format: Format to return data in, options are "default", "pandas",
399
+ "polars"
400
+ stream: "default" for metrics, "system" for machine metrics
401
+ Returns:
402
+ pandas.DataFrame: If `format="pandas"`, returns a `pandas.DataFrame`
403
+ of history metrics.
404
+ polars.DataFrame: If `format="polars"`, returns a `polars.DataFrame`
405
+ of history metrics.
406
+ list of dicts: If `format="default"`, returns a list of dicts
407
+ containing history metrics with a `run_id` key.
408
+ """
409
+ if format not in ("default", "pandas", "polars"):
410
+ raise ValueError(
411
+ f"Invalid format: {format}. Must be one of 'default', 'pandas', 'polars'"
412
+ )
413
+
414
+ histories = []
415
+
416
+ if format == "default":
417
+ for run in self:
418
+ history_data = run.history(
419
+ samples=samples,
420
+ keys=keys,
421
+ x_axis=x_axis,
422
+ pandas=False,
423
+ stream=stream,
424
+ )
425
+ if not history_data:
426
+ continue
427
+ for entry in history_data:
428
+ entry["run_id"] = run.id
429
+ histories.extend(history_data)
430
+
431
+ return histories
432
+
433
+ if format == "pandas":
434
+ pd = util.get_module(
435
+ "pandas", required="Exporting pandas DataFrame requires pandas"
436
+ )
437
+ for run in self:
438
+ history_data = run.history(
439
+ samples=samples,
440
+ keys=keys,
441
+ x_axis=x_axis,
442
+ pandas=False,
443
+ stream=stream,
444
+ )
445
+ if not history_data:
446
+ continue
447
+ df = pd.DataFrame.from_records(history_data)
448
+ df["run_id"] = run.id
449
+ histories.append(df)
450
+ if not histories:
451
+ return pd.DataFrame()
452
+ combined_df = pd.concat(histories)
453
+ combined_df.reset_index(drop=True, inplace=True)
454
+ # sort columns for consistency
455
+ combined_df = combined_df[(sorted(combined_df.columns))]
456
+
457
+ return combined_df
458
+
459
+ if format == "polars":
460
+ pl = util.get_module(
461
+ "polars", required="Exporting polars DataFrame requires polars"
462
+ )
463
+ for run in self:
464
+ history_data = run.history(
465
+ samples=samples,
466
+ keys=keys,
467
+ x_axis=x_axis,
468
+ pandas=False,
469
+ stream=stream,
470
+ )
471
+ if not history_data:
472
+ continue
473
+ df = pl.from_records(history_data)
474
+ df = df.with_columns(pl.lit(run.id).alias("run_id"))
475
+ histories.append(df)
476
+ if not histories:
477
+ return pl.DataFrame()
478
+ combined_df = pl.concat(histories, how="vertical")
479
+ # sort columns for consistency
480
+ combined_df = combined_df.select(sorted(combined_df.columns))
481
+
482
+ return combined_df
483
+
484
+ def __repr__(self):
485
+ return f"<Runs {self.entity}/{self.project}>"
486
+
487
+ def upgrade_to_full(self):
488
+ """Upgrade this Runs collection from lazy to full mode.
489
+
490
+ This switches to fetching full run data and
491
+ upgrades any already-loaded Run objects to have full data.
492
+ Uses parallel loading for better performance when upgrading multiple runs.
493
+ """
494
+ if not self._lazy:
495
+ return # Already in full mode
496
+
497
+ # Switch to full mode
498
+ self._lazy = False
499
+
500
+ # Regenerate query with full fragment
501
+ self.QUERY = _create_runs_query(
502
+ lazy=False,
503
+ with_internal_id=_server_provides_internal_id_for_project(self.client),
504
+ with_project_id=_server_provides_project_id_for_run(self.client),
505
+ )
506
+
507
+ # Upgrade any existing runs that have been loaded - use parallel loading for performance
508
+ lazy_runs = [run for run in self.objects if run._lazy]
509
+ if lazy_runs:
510
+ from concurrent.futures import ThreadPoolExecutor
511
+
512
+ # Limit workers to avoid overwhelming the server
513
+ max_workers = min(len(lazy_runs), 10)
514
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
515
+ futures = [executor.submit(run.load_full_data) for run in lazy_runs]
516
+ # Wait for all to complete
517
+ for future in futures:
518
+ future.result()
519
+
520
+
521
+ class Run(Attrs):
522
+ """A single run associated with an entity and project.
523
+
524
+ Args:
525
+ client: The W&B API client.
526
+ entity: The entity associated with the run.
527
+ project: The project associated with the run.
528
+ run_id: The unique identifier for the run.
529
+ attrs: The attributes of the run.
530
+ include_sweeps: Whether to include sweeps in the run.
531
+
532
+ Attributes:
533
+ tags ([str]): a list of tags associated with the run
534
+ url (str): the url of this run
535
+ id (str): unique identifier for the run (defaults to eight characters)
536
+ name (str): the name of the run
537
+ state (str): one of: running, finished, crashed, killed, preempting, preempted
538
+ config (dict): a dict of hyperparameters associated with the run
539
+ created_at (str): ISO timestamp when the run was started
540
+ system_metrics (dict): the latest system metrics recorded for the run
541
+ summary (dict): A mutable dict-like property that holds the current summary.
542
+ Calling update will persist any changes.
543
+ project (str): the project associated with the run
544
+ entity (str): the name of the entity associated with the run
545
+ project_internal_id (int): the internal id of the project
546
+ user (str): the name of the user who created the run
547
+ path (str): Unique identifier [entity]/[project]/[run_id]
548
+ notes (str): Notes about the run
549
+ read_only (boolean): Whether the run is editable
550
+ history_keys (str): Keys of the history metrics that have been logged
551
+ with `wandb.log({key: value})`
552
+ metadata (str): Metadata about the run from wandb-metadata.json
553
+ """
554
+
555
+ def __init__(
556
+ self,
557
+ client: RetryingClient,
558
+ entity: str,
559
+ project: str,
560
+ run_id: str,
561
+ attrs: Mapping | None = None,
562
+ include_sweeps: bool = True,
563
+ lazy: bool = True,
564
+ ):
565
+ """Initialize a Run object.
566
+
567
+ Run is always initialized by calling api.runs() where api is an instance of
568
+ wandb.Api.
569
+ """
570
+ _attrs = attrs or {}
571
+ super().__init__(dict(_attrs))
572
+ self.client = client
573
+ self._entity = entity
574
+ self.project = project
575
+ self._files = {}
576
+ self._base_dir = env.get_dir(tempfile.gettempdir())
577
+ self.id = run_id
578
+ self.sweep = None
579
+ self._include_sweeps = include_sweeps
580
+ self._lazy = lazy
581
+ self._full_data_loaded = False # Track if we've loaded full data
582
+ self.dir = os.path.join(self._base_dir, *self.path)
583
+ try:
584
+ os.makedirs(self.dir)
585
+ except OSError:
586
+ pass
587
+ self._summary = None
588
+ self._metadata: dict[str, Any] | None = None
589
+ self._state = _attrs.get("state", "not found")
590
+ self.server_provides_internal_id_field: bool | None = None
591
+ self._server_provides_project_id_field: bool | None = None
592
+ self._is_loaded: bool = False
593
+
594
+ self.load(force=not _attrs)
595
+
596
+ @property
597
+ def state(self):
598
+ """The state of the run. Can be one of: Finished, Failed, Crashed, or Running."""
599
+ return self._state
600
+
601
+ @property
602
+ def entity(self):
603
+ """The entity associated with the run."""
604
+ return self._entity
605
+
606
+ @property
607
+ def username(self):
608
+ """This API is deprecated. Use `entity` instead."""
609
+ wandb.termwarn("Run.username is deprecated. Please use Run.entity instead.")
610
+ return self._entity
611
+
612
+ @property
613
+ def storage_id(self):
614
+ """The unique storage identifier for the run."""
615
+ # For compatibility with wandb.Run, which has storage IDs
616
+ # in self.storage_id and names in self.id.
617
+
618
+ return self._attrs.get("id")
619
+
620
+ @property
621
+ def id(self):
622
+ """The unique identifier for the run."""
623
+ return self._attrs.get("name")
624
+
625
+ @id.setter
626
+ def id(self, new_id):
627
+ """Set the unique identifier for the run."""
628
+ attrs = self._attrs
629
+ attrs["name"] = new_id
630
+ return new_id
631
+
632
+ @property
633
+ def name(self):
634
+ """The name of the run."""
635
+ return self._attrs.get("displayName")
636
+
637
+ @name.setter
638
+ def name(self, new_name):
639
+ """Set the name of the run."""
640
+ self._attrs["displayName"] = new_name
641
+ return new_name
642
+
643
+ @classmethod
644
+ def create(
645
+ cls,
646
+ api: public.Api,
647
+ run_id: str | None = None,
648
+ project: str | None = None,
649
+ entity: str | None = None,
650
+ state: Literal["running", "pending"] = "running",
651
+ ):
652
+ """Create a run for the given project."""
653
+ api._sentry.message("Invoking Run.create", level="info")
654
+ run_id = run_id or runid.generate_id()
655
+ project = project or api.settings.get("project") or "uncategorized"
656
+ mutation = gql(
657
+ """
658
+ mutation UpsertBucket($project: String, $entity: String, $name: String!, $state: String) {
659
+ upsertBucket(input: {modelName: $project, entityName: $entity, name: $name, state: $state}) {
660
+ bucket {
661
+ project {
662
+ name
663
+ entity { name }
664
+ }
665
+ id
666
+ name
667
+ }
668
+ inserted
669
+ }
670
+ }
671
+ """
672
+ )
673
+ variables = {
674
+ "entity": entity,
675
+ "project": project,
676
+ "name": run_id,
677
+ "state": state,
678
+ }
679
+ res = api.client.execute(mutation, variable_values=variables)
680
+ res = res["upsertBucket"]["bucket"]
681
+ return Run(
682
+ api.client,
683
+ res["project"]["entity"]["name"],
684
+ res["project"]["name"],
685
+ res["name"],
686
+ {
687
+ "id": res["id"],
688
+ "config": "{}",
689
+ "systemMetrics": "{}",
690
+ "summaryMetrics": "{}",
691
+ "tags": [],
692
+ "description": None,
693
+ "notes": None,
694
+ "state": state,
695
+ },
696
+ lazy=False, # Created runs should have full data available immediately
697
+ )
698
+
699
+ def _load_with_fragment(
700
+ self, fragment: str, fragment_name: str, force: bool = False
701
+ ):
702
+ """Load run data using specified GraphQL fragment."""
703
+ # Cache the server capability check to avoid repeated network calls
704
+ if self._server_provides_project_id_field is None:
705
+ self._server_provides_project_id_field = (
706
+ _server_provides_project_id_for_run(self.client)
707
+ )
708
+
709
+ query = gql(
710
+ f"""
711
+ query Run($project: String!, $entity: String!, $name: String!) {{
712
+ project(name: $project, entityName: $entity) {{
713
+ run(name: $name) {{
714
+ {"projectId" if self._server_provides_project_id_field else ""}
715
+ ...{fragment_name}
716
+ }}
717
+ }}
718
+ }}
719
+ {fragment}
720
+ """
721
+ )
722
+
723
+ if force or not self._attrs:
724
+ response = self._exec(query)
725
+ if (
726
+ response is None
727
+ or response.get("project") is None
728
+ or response["project"].get("run") is None
729
+ ):
730
+ raise ValueError("Could not find run {}".format(self))
731
+ self._attrs = response["project"]["run"]
732
+
733
+ self._state = self._attrs["state"]
734
+ if self._attrs.get("user"):
735
+ self.user = public.User(self.client, self._attrs["user"])
736
+
737
+ if self._include_sweeps and self.sweep_name and not self.sweep:
738
+ # There may be a lot of runs. Don't bother pulling them all
739
+ # just for the sake of this one.
740
+ self.sweep = public.Sweep.get(
741
+ self.client,
742
+ self.entity,
743
+ self.project,
744
+ self.sweep_name,
745
+ withRuns=False,
746
+ )
747
+
748
+ if not self._is_loaded:
749
+ # Always set _project_internal_id if projectId is available, regardless of fragment type
750
+ if "projectId" in self._attrs:
751
+ self._project_internal_id = int(self._attrs["projectId"])
752
+ else:
753
+ self._project_internal_id = None
754
+
755
+ # Only call _load_from_attrs when using the full fragment or when the fields are actually present
756
+ if fragment_name == RUN_FRAGMENT_NAME or (
757
+ "config" in self._attrs
758
+ or "summaryMetrics" in self._attrs
759
+ or "systemMetrics" in self._attrs
760
+ ):
761
+ self._load_from_attrs()
762
+ self._is_loaded = True
763
+
764
+ return self._attrs
765
+
766
+ def _load_from_attrs(self):
767
+ self._state = self._attrs.get("state", None)
768
+
769
+ # Only convert fields if they exist in _attrs
770
+ if "config" in self._attrs:
771
+ self._attrs["config"] = _convert_to_dict(self._attrs.get("config"))
772
+ if "summaryMetrics" in self._attrs:
773
+ self._attrs["summaryMetrics"] = _convert_to_dict(
774
+ self._attrs.get("summaryMetrics")
775
+ )
776
+ if "systemMetrics" in self._attrs:
777
+ self._attrs["systemMetrics"] = _convert_to_dict(
778
+ self._attrs.get("systemMetrics")
779
+ )
780
+
781
+ # Only check for sweeps if sweep_name is available (not in lazy mode or if it exists)
782
+ if self._include_sweeps and self._attrs.get("sweepName") and not self.sweep:
783
+ # There may be a lot of runs. Don't bother pulling them all
784
+ self.sweep = public.Sweep(
785
+ self.client,
786
+ self.entity,
787
+ self.project,
788
+ self._attrs["sweepName"],
789
+ withRuns=False,
790
+ )
791
+
792
+ config_user, config_raw = {}, {}
793
+ if self._attrs.get("config"):
794
+ try:
795
+ # config is already converted to dict by _convert_to_dict
796
+ for key, value in self._attrs.get("config", {}).items():
797
+ config = config_raw if key in WANDB_INTERNAL_KEYS else config_user
798
+ if isinstance(value, dict) and "value" in value:
799
+ config[key] = value["value"]
800
+ else:
801
+ config[key] = value
802
+ except (TypeError, AttributeError):
803
+ # Handle case where config is malformed or not a dict
804
+ pass
805
+
806
+ config_raw.update(config_user)
807
+ self._attrs["config"] = config_user
808
+ self._attrs["rawconfig"] = config_raw
809
+
810
+ return self._attrs
811
+
812
+ def load(self, force=False):
813
+ """Load run data using appropriate fragment based on lazy mode."""
814
+ if self._lazy:
815
+ return self._load_with_fragment(
816
+ LIGHTWEIGHT_RUN_FRAGMENT, LIGHTWEIGHT_RUN_FRAGMENT_NAME, force
817
+ )
818
+ else:
819
+ return self._load_with_fragment(RUN_FRAGMENT, RUN_FRAGMENT_NAME, force)
820
+
821
+ @normalize_exceptions
822
+ def wait_until_finished(self):
823
+ """Check the state of the run until it is finished."""
824
+ query = gql(
825
+ """
826
+ query RunState($project: String!, $entity: String!, $name: String!) {
827
+ project(name: $project, entityName: $entity) {
828
+ run(name: $name) {
829
+ state
830
+ }
831
+ }
832
+ }
833
+ """
834
+ )
835
+ while True:
836
+ res = self._exec(query)
837
+ state = res["project"]["run"]["state"]
838
+ if state in ["finished", "crashed", "failed"]:
839
+ self._attrs["state"] = state
840
+ self._state = state
841
+ return
842
+ time.sleep(5)
843
+
844
+ @normalize_exceptions
845
+ def update(self):
846
+ """Persist changes to the run object to the wandb backend."""
847
+ mutation = gql(
848
+ """
849
+ mutation UpsertBucket($id: String!, $description: String, $display_name: String, $notes: String, $tags: [String!], $config: JSONString!, $groupName: String, $jobType: String) {{
850
+ upsertBucket(input: {{id: $id, description: $description, displayName: $display_name, notes: $notes, tags: $tags, config: $config, groupName: $groupName, jobType: $jobType}}) {{
851
+ bucket {{
852
+ ...RunFragment
853
+ }}
854
+ }}
855
+ }}
856
+ {}
857
+ """.format(RUN_FRAGMENT)
858
+ )
859
+ _ = self._exec(
860
+ mutation,
861
+ id=self.storage_id,
862
+ tags=self.tags,
863
+ description=self.description,
864
+ notes=self.notes,
865
+ display_name=self.display_name,
866
+ config=self.json_config,
867
+ groupName=self.group,
868
+ jobType=self.job_type,
869
+ )
870
+ self.summary.update()
871
+
872
+ @normalize_exceptions
873
+ def delete(self, delete_artifacts=False):
874
+ """Delete the given run from the wandb backend.
875
+
876
+ Args:
877
+ delete_artifacts (bool, optional): Whether to delete the artifacts
878
+ associated with the run.
879
+ """
880
+ mutation = gql(
881
+ """
882
+ mutation DeleteRun(
883
+ $id: ID!,
884
+ {}
885
+ ) {{
886
+ deleteRun(input: {{
887
+ id: $id,
888
+ {}
889
+ }}) {{
890
+ clientMutationId
891
+ }}
892
+ }}
893
+ """.format(
894
+ "$deleteArtifacts: Boolean" if delete_artifacts else "",
895
+ "deleteArtifacts: $deleteArtifacts" if delete_artifacts else "",
896
+ )
897
+ )
898
+
899
+ self.client.execute(
900
+ mutation,
901
+ variable_values={
902
+ "id": self.storage_id,
903
+ "deleteArtifacts": delete_artifacts,
904
+ },
905
+ )
906
+
907
+ def save(self):
908
+ """Persist changes to the run object to the W&B backend."""
909
+ self.update()
910
+
911
+ @property
912
+ def json_config(self):
913
+ """Return the run config as a JSON string.
914
+
915
+ <!-- lazydoc-ignore: internal -->
916
+ """
917
+ config = {}
918
+ if "_wandb" in self.rawconfig:
919
+ config["_wandb"] = {"value": self.rawconfig["_wandb"], "desc": None}
920
+ for k, v in self.config.items():
921
+ config[k] = {"value": v, "desc": None}
922
+ return json.dumps(config)
923
+
924
+ def _exec(self, query, **kwargs):
925
+ """Execute a query against the cloud backend."""
926
+ variables = {"entity": self.entity, "project": self.project, "name": self.id}
927
+ variables.update(kwargs)
928
+ return self.client.execute(query, variable_values=variables)
929
+
930
+ def _sampled_history(self, keys, x_axis="_step", samples=500):
931
+ spec = {"keys": [x_axis] + keys, "samples": samples}
932
+ query = gql(
933
+ """
934
+ query RunSampledHistory($project: String!, $entity: String!, $name: String!, $specs: [JSONString!]!) {
935
+ project(name: $project, entityName: $entity) {
936
+ run(name: $name) { sampledHistory(specs: $specs) }
937
+ }
938
+ }
939
+ """
940
+ )
941
+
942
+ response = self._exec(query, specs=[json.dumps(spec)])
943
+ # sampledHistory returns one list per spec, we only send one spec
944
+ return response["project"]["run"]["sampledHistory"][0]
945
+
946
+ def _full_history(self, samples=500, stream="default"):
947
+ node = "history" if stream == "default" else "events"
948
+ query = gql(
949
+ """
950
+ query RunFullHistory($project: String!, $entity: String!, $name: String!, $samples: Int) {{
951
+ project(name: $project, entityName: $entity) {{
952
+ run(name: $name) {{ {}(samples: $samples) }}
953
+ }}
954
+ }}
955
+ """.format(node)
956
+ )
957
+
958
+ response = self._exec(query, samples=samples)
959
+ return [json.loads(line) for line in response["project"]["run"][node]]
960
+
961
+ @normalize_exceptions
962
+ def files(
963
+ self,
964
+ names: list[str] | None = None,
965
+ pattern: str | None = None,
966
+ per_page: int = 50,
967
+ ):
968
+ """Returns a `Files` object for all files in the run which match the given criteria.
969
+
970
+ You can specify a list of exact file names to match, or a pattern to match against.
971
+ If both are provided, the pattern will be ignored.
972
+
973
+ Args:
974
+ names (list): names of the requested files, if empty returns all files
975
+ pattern (str, optional): Pattern to match when returning files from W&B.
976
+ This pattern uses mySQL's LIKE syntax,
977
+ so matching all files that end with .json would be "%.json".
978
+ If both names and pattern are provided, a ValueError will be raised.
979
+ per_page (int): number of results per page.
980
+
981
+ Returns:
982
+ A `Files` object, which is an iterator over `File` objects.
983
+ """
984
+ return public.Files(
985
+ self.client,
986
+ self,
987
+ names or [],
988
+ pattern=pattern,
989
+ per_page=per_page,
990
+ )
991
+
992
+ @normalize_exceptions
993
+ def file(self, name):
994
+ """Return the path of a file with a given name in the artifact.
995
+
996
+ Args:
997
+ name (str): name of requested file.
998
+
999
+ Returns:
1000
+ A `File` matching the name argument.
1001
+ """
1002
+ return public.Files(self.client, self, [name])[0]
1003
+
1004
+ @normalize_exceptions
1005
+ def upload_file(self, path, root="."):
1006
+ """Upload a local file to W&B, associating it with this run.
1007
+
1008
+ Args:
1009
+ path (str): Path to the file to upload. Can be absolute or relative.
1010
+ root (str): The root path to save the file relative to. For example,
1011
+ if you want to have the file saved in the run as "my_dir/file.txt"
1012
+ and you're currently in "my_dir" you would set root to "../".
1013
+ Defaults to current directory (".").
1014
+
1015
+ Returns:
1016
+ A `File` object representing the uploaded file.
1017
+ """
1018
+ api = InternalApi(
1019
+ default_settings={"entity": self.entity, "project": self.project},
1020
+ retry_timedelta=RETRY_TIMEDELTA,
1021
+ )
1022
+ api.set_current_run_id(self.id)
1023
+ root = os.path.abspath(root)
1024
+ name = os.path.relpath(path, root)
1025
+ upload_path = util.make_file_path_upload_safe(name)
1026
+ with open(os.path.join(root, name), "rb") as f:
1027
+ api.push({LogicalPath(upload_path): f})
1028
+ return public.Files(self.client, self, [name])[0]
1029
+
1030
+ @normalize_exceptions
1031
+ def history(
1032
+ self, samples=500, keys=None, x_axis="_step", pandas=True, stream="default"
1033
+ ):
1034
+ """Return sampled history metrics for a run.
1035
+
1036
+ This is simpler and faster if you are ok with the history records being sampled.
1037
+
1038
+ Args:
1039
+ samples : (int, optional) The number of samples to return
1040
+ pandas : (bool, optional) Return a pandas dataframe
1041
+ keys : (list, optional) Only return metrics for specific keys
1042
+ x_axis : (str, optional) Use this metric as the xAxis defaults to _step
1043
+ stream : (str, optional) "default" for metrics, "system" for machine metrics
1044
+
1045
+ Returns:
1046
+ pandas.DataFrame: If pandas=True returns a `pandas.DataFrame` of history
1047
+ metrics.
1048
+ list of dicts: If pandas=False returns a list of dicts of history metrics.
1049
+ """
1050
+ if keys is not None and not isinstance(keys, list):
1051
+ wandb.termerror("keys must be specified in a list")
1052
+ return []
1053
+ if keys is not None and len(keys) > 0 and not isinstance(keys[0], str):
1054
+ wandb.termerror("keys argument must be a list of strings")
1055
+ return []
1056
+
1057
+ if keys and stream != "default":
1058
+ wandb.termerror("stream must be default when specifying keys")
1059
+ return []
1060
+ elif keys:
1061
+ lines = self._sampled_history(keys=keys, x_axis=x_axis, samples=samples)
1062
+ else:
1063
+ lines = self._full_history(samples=samples, stream=stream)
1064
+ if pandas:
1065
+ pd = util.get_module("pandas")
1066
+ if pd:
1067
+ lines = pd.DataFrame.from_records(lines)
1068
+ else:
1069
+ wandb.termwarn("Unable to load pandas, call history with pandas=False")
1070
+ return lines
1071
+
1072
+ @normalize_exceptions
1073
+ def scan_history(self, keys=None, page_size=1000, min_step=None, max_step=None):
1074
+ """Returns an iterable collection of all history records for a run.
1075
+
1076
+ Args:
1077
+ keys ([str], optional): only fetch these keys, and only fetch rows that have all of keys defined.
1078
+ page_size (int, optional): size of pages to fetch from the api.
1079
+ min_step (int, optional): the minimum number of pages to scan at a time.
1080
+ max_step (int, optional): the maximum number of pages to scan at a time.
1081
+
1082
+ Returns:
1083
+ An iterable collection over history records (dict).
1084
+
1085
+ Example:
1086
+ Export all the loss values for an example run
1087
+
1088
+ ```python
1089
+ run = api.run("entity/project-name/run-id")
1090
+ history = run.scan_history(keys=["Loss"])
1091
+ losses = [row["Loss"] for row in history]
1092
+ ```
1093
+ """
1094
+ if keys is not None and not isinstance(keys, list):
1095
+ wandb.termerror("keys must be specified in a list")
1096
+ return []
1097
+ if keys is not None and len(keys) > 0 and not isinstance(keys[0], str):
1098
+ wandb.termerror("keys argument must be a list of strings")
1099
+ return []
1100
+
1101
+ last_step = self.lastHistoryStep
1102
+ # set defaults for min/max step
1103
+ if min_step is None:
1104
+ min_step = 0
1105
+ if max_step is None:
1106
+ max_step = last_step + 1
1107
+ # if the max step is past the actual last step, clamp it down
1108
+ if max_step > last_step:
1109
+ max_step = last_step + 1
1110
+ if keys is None:
1111
+ return public.HistoryScan(
1112
+ run=self,
1113
+ client=self.client,
1114
+ page_size=page_size,
1115
+ min_step=min_step,
1116
+ max_step=max_step,
1117
+ )
1118
+ else:
1119
+ return public.SampledHistoryScan(
1120
+ run=self,
1121
+ client=self.client,
1122
+ keys=keys,
1123
+ page_size=page_size,
1124
+ min_step=min_step,
1125
+ max_step=max_step,
1126
+ )
1127
+
1128
+ @normalize_exceptions
1129
+ def logged_artifacts(self, per_page: int = 100) -> public.RunArtifacts:
1130
+ """Fetches all artifacts logged by this run.
1131
+
1132
+ Retrieves all output artifacts that were logged during the run. Returns a
1133
+ paginated result that can be iterated over or collected into a single list.
1134
+
1135
+ Args:
1136
+ per_page: Number of artifacts to fetch per API request.
1137
+
1138
+ Returns:
1139
+ An iterable collection of all Artifact objects logged as outputs during this run.
1140
+
1141
+ Example:
1142
+ ```python
1143
+ import wandb
1144
+ import tempfile
1145
+
1146
+ with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt") as tmp:
1147
+ tmp.write("This is a test artifact")
1148
+ tmp_path = tmp.name
1149
+ run = wandb.init(project="artifact-example")
1150
+ artifact = wandb.Artifact("test_artifact", type="dataset")
1151
+ artifact.add_file(tmp_path)
1152
+ run.log_artifact(artifact)
1153
+ run.finish()
1154
+
1155
+ api = wandb.Api()
1156
+
1157
+ finished_run = api.run(f"{run.entity}/{run.project}/{run.id}")
1158
+
1159
+ for logged_artifact in finished_run.logged_artifacts():
1160
+ print(logged_artifact.name)
1161
+ ```
1162
+
1163
+ """
1164
+ return public.RunArtifacts(self.client, self, mode="logged", per_page=per_page)
1165
+
1166
+ @normalize_exceptions
1167
+ def used_artifacts(self, per_page: int = 100) -> public.RunArtifacts:
1168
+ """Fetches artifacts explicitly used by this run.
1169
+
1170
+ Retrieves only the input artifacts that were explicitly declared as used
1171
+ during the run, typically via `run.use_artifact()`. Returns a paginated
1172
+ result that can be iterated over or collected into a single list.
1173
+
1174
+ Args:
1175
+ per_page: Number of artifacts to fetch per API request.
1176
+
1177
+ Returns:
1178
+ An iterable collection of Artifact objects explicitly used as inputs in this run.
1179
+
1180
+ Example:
1181
+ ```python
1182
+ import wandb
1183
+
1184
+ run = wandb.init(project="artifact-example")
1185
+ run.use_artifact("test_artifact:latest")
1186
+ run.finish()
1187
+
1188
+ api = wandb.Api()
1189
+ finished_run = api.run(f"{run.entity}/{run.project}/{run.id}")
1190
+ for used_artifact in finished_run.used_artifacts():
1191
+ print(used_artifact.name)
1192
+ test_artifact
1193
+ ```
1194
+ """
1195
+ return public.RunArtifacts(self.client, self, mode="used", per_page=per_page)
1196
+
1197
+ @normalize_exceptions
1198
+ def use_artifact(self, artifact, use_as=None):
1199
+ """Declare an artifact as an input to a run.
1200
+
1201
+ Args:
1202
+ artifact (`Artifact`): An artifact returned from
1203
+ `wandb.Api().artifact(name)`
1204
+ use_as (string, optional): A string identifying
1205
+ how the artifact is used in the script. Used
1206
+ to easily differentiate artifacts used in a
1207
+ run, when using the beta wandb launch
1208
+ feature's artifact swapping functionality.
1209
+
1210
+ Returns:
1211
+ An `Artifact` object.
1212
+ """
1213
+ api = InternalApi(
1214
+ default_settings={"entity": self.entity, "project": self.project},
1215
+ retry_timedelta=RETRY_TIMEDELTA,
1216
+ )
1217
+ api.set_current_run_id(self.id)
1218
+
1219
+ if isinstance(artifact, wandb.Artifact) and not artifact.is_draft():
1220
+ api.use_artifact(
1221
+ artifact.id,
1222
+ use_as=use_as or artifact.name,
1223
+ artifact_entity_name=artifact.entity,
1224
+ artifact_project_name=artifact.project,
1225
+ )
1226
+ return artifact
1227
+ elif isinstance(artifact, wandb.Artifact) and artifact.is_draft():
1228
+ raise ValueError(
1229
+ "Only existing artifacts are accepted by this api. "
1230
+ "Manually create one with `wandb artifact put`"
1231
+ )
1232
+ else:
1233
+ raise ValueError("You must pass a wandb.Api().artifact() to use_artifact")
1234
+
1235
+ @normalize_exceptions
1236
+ def log_artifact(
1237
+ self,
1238
+ artifact: wandb.Artifact,
1239
+ aliases: Collection[str] | None = None,
1240
+ tags: Collection[str] | None = None,
1241
+ ):
1242
+ """Declare an artifact as output of a run.
1243
+
1244
+ Args:
1245
+ artifact (`Artifact`): An artifact returned from
1246
+ `wandb.Api().artifact(name)`.
1247
+ aliases (list, optional): Aliases to apply to this artifact.
1248
+ tags: (list, optional) Tags to apply to this artifact, if any.
1249
+
1250
+ Returns:
1251
+ A `Artifact` object.
1252
+ """
1253
+ api = InternalApi(
1254
+ default_settings={"entity": self.entity, "project": self.project},
1255
+ retry_timedelta=RETRY_TIMEDELTA,
1256
+ )
1257
+ api.set_current_run_id(self.id)
1258
+
1259
+ if not isinstance(artifact, wandb.Artifact):
1260
+ raise TypeError("You must pass a wandb.Api().artifact() to use_artifact")
1261
+ if artifact.is_draft():
1262
+ raise ValueError(
1263
+ "Only existing artifacts are accepted by this api. "
1264
+ "Manually create one with `wandb artifact put`"
1265
+ )
1266
+ if (
1267
+ self.entity != artifact.source_entity
1268
+ or self.project != artifact.source_project
1269
+ ):
1270
+ raise ValueError("A run can't log an artifact to a different project.")
1271
+
1272
+ artifact_collection_name = artifact.source_name.split(":")[0]
1273
+ api.create_artifact(
1274
+ artifact.type,
1275
+ artifact_collection_name,
1276
+ artifact.digest,
1277
+ aliases=aliases,
1278
+ tags=tags,
1279
+ )
1280
+ return artifact
1281
+
1282
+ def load_full_data(self, force: bool = False) -> dict[str, Any]:
1283
+ """Load full run data including heavy fields like config, systemMetrics, summaryMetrics.
1284
+
1285
+ This method is useful when you initially used lazy=True for listing runs,
1286
+ but need access to the full data for specific runs.
1287
+
1288
+ Args:
1289
+ force: Force reload even if data is already loaded
1290
+
1291
+ Returns:
1292
+ The loaded run attributes
1293
+ """
1294
+ if not self._lazy and not force:
1295
+ # Already in full mode, no need to reload
1296
+ return self._attrs
1297
+
1298
+ # Load full data and mark as loaded
1299
+ result = self._load_with_fragment(RUN_FRAGMENT, RUN_FRAGMENT_NAME, force=True)
1300
+ self._full_data_loaded = True
1301
+ return result
1302
+
1303
+ @property
1304
+ def config(self):
1305
+ """Get run config. Auto-loads full data if in lazy mode."""
1306
+ if self._lazy and not self._full_data_loaded and "config" not in self._attrs:
1307
+ self.load_full_data()
1308
+ return self._attrs.get("config", {})
1309
+
1310
+ @property
1311
+ def summary(self):
1312
+ """Get run summary metrics. Auto-loads full data if in lazy mode."""
1313
+ if (
1314
+ self._lazy
1315
+ and not self._full_data_loaded
1316
+ and "summaryMetrics" not in self._attrs
1317
+ ):
1318
+ self.load_full_data()
1319
+ if self._summary is None:
1320
+ from wandb.old.summary import HTTPSummary
1321
+
1322
+ # TODO: fix the outdir issue
1323
+ self._summary = HTTPSummary(self, self.client, summary=self.summary_metrics)
1324
+ return self._summary
1325
+
1326
+ @property
1327
+ def system_metrics(self):
1328
+ """Get run system metrics. Auto-loads full data if in lazy mode."""
1329
+ if (
1330
+ self._lazy
1331
+ and not self._full_data_loaded
1332
+ and "systemMetrics" not in self._attrs
1333
+ ):
1334
+ self.load_full_data()
1335
+ return self._attrs.get("systemMetrics", {})
1336
+
1337
+ @property
1338
+ def summary_metrics(self):
1339
+ """Get run summary metrics. Auto-loads full data if in lazy mode."""
1340
+ if (
1341
+ self._lazy
1342
+ and not self._full_data_loaded
1343
+ and "summaryMetrics" not in self._attrs
1344
+ ):
1345
+ self.load_full_data()
1346
+ return self._attrs.get("summaryMetrics", {})
1347
+
1348
+ @property
1349
+ def rawconfig(self):
1350
+ """Get raw run config including internal keys. Auto-loads full data if in lazy mode."""
1351
+ if self._lazy and not self._full_data_loaded and "rawconfig" not in self._attrs:
1352
+ self.load_full_data()
1353
+ return self._attrs.get("rawconfig", {})
1354
+
1355
+ @property
1356
+ def sweep_name(self):
1357
+ """Get sweep name. Always available since sweepName is in lightweight fragment."""
1358
+ # sweepName is included in lightweight fragment, so no need to load full data
1359
+ return self._attrs.get("sweepName")
1360
+
1361
+ @property
1362
+ def path(self):
1363
+ """The path of the run. The path is a list containing the entity, project, and run_id."""
1364
+ return [
1365
+ urllib.parse.quote_plus(str(self.entity)),
1366
+ urllib.parse.quote_plus(str(self.project)),
1367
+ urllib.parse.quote_plus(str(self.id)),
1368
+ ]
1369
+
1370
+ @property
1371
+ def url(self):
1372
+ """The URL of the run.
1373
+
1374
+ The run URL is generated from the entity, project, and run_id. For
1375
+ SaaS users, it takes the form of `https://wandb.ai/entity/project/run_id`.
1376
+ """
1377
+ path = self.path
1378
+ path.insert(2, "runs")
1379
+ return self.client.app_url + "/".join(path)
1380
+
1381
+ @property
1382
+ def metadata(self):
1383
+ """Metadata about the run from wandb-metadata.json.
1384
+
1385
+ Metadata includes the run's description, tags, start time, memory
1386
+ usage and more.
1387
+ """
1388
+ if self._metadata is None:
1389
+ try:
1390
+ f = self.file("wandb-metadata.json")
1391
+ session = self.client._client.transport.session
1392
+ response = session.get(f.url, timeout=5)
1393
+ response.raise_for_status()
1394
+ contents = response.content
1395
+ self._metadata = json_util.loads(contents)
1396
+ except: # noqa: E722
1397
+ # file doesn't exist, or can't be downloaded, or can't be parsed
1398
+ pass
1399
+ return self._metadata
1400
+
1401
+ @property
1402
+ def lastHistoryStep(self): # noqa: N802
1403
+ """Returns the last step logged in the run's history."""
1404
+ query = gql(
1405
+ """
1406
+ query RunHistoryKeys($project: String!, $entity: String!, $name: String!) {
1407
+ project(name: $project, entityName: $entity) {
1408
+ run(name: $name) { historyKeys }
1409
+ }
1410
+ }
1411
+ """
1412
+ )
1413
+ response = self._exec(query)
1414
+ if (
1415
+ response is None
1416
+ or response.get("project") is None
1417
+ or response["project"].get("run") is None
1418
+ or response["project"]["run"].get("historyKeys") is None
1419
+ ):
1420
+ return -1
1421
+ history_keys = response["project"]["run"]["historyKeys"]
1422
+ return history_keys["lastStep"] if "lastStep" in history_keys else -1
1423
+
1424
+ def to_html(self, height=420, hidden=False):
1425
+ """Generate HTML containing an iframe displaying this run."""
1426
+ url = self.url + "?jupyter=true"
1427
+ style = f"border:none;width:100%;height:{height}px;"
1428
+ prefix = ""
1429
+ if hidden:
1430
+ style += "display:none;"
1431
+ prefix = ipython.toggle_button()
1432
+ return prefix + f"<iframe src={url!r} style={style!r}></iframe>"
1433
+
1434
+ def _repr_html_(self) -> str:
1435
+ return self.to_html()
1436
+
1437
+ def __repr__(self):
1438
+ return "<Run {} ({})>".format("/".join(self.path), self.state)