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,1050 @@
1
+ """W&B Public API for Artifact objects.
2
+
3
+ This module provides classes for interacting with W&B artifacts and their
4
+ collections.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import re
11
+ from copy import copy
12
+ from typing import TYPE_CHECKING, Any, Iterable, Literal, Mapping, Sequence
13
+
14
+ from typing_extensions import override
15
+ from wandb_gql import Client, gql
16
+
17
+ import wandb
18
+ from wandb._strutils import nameof
19
+ from wandb.apis import public
20
+ from wandb.apis.normalize import normalize_exceptions
21
+ from wandb.apis.paginator import Paginator, SizedPaginator
22
+ from wandb.errors.term import termlog
23
+ from wandb.proto.wandb_deprecated import Deprecated
24
+ from wandb.proto.wandb_internal_pb2 import ServerFeature
25
+ from wandb.sdk.artifacts._generated import (
26
+ ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL,
27
+ ARTIFACT_VERSION_FILES_GQL,
28
+ CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
29
+ DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
30
+ DELETE_ARTIFACT_PORTFOLIO_GQL,
31
+ DELETE_ARTIFACT_SEQUENCE_GQL,
32
+ MOVE_ARTIFACT_COLLECTION_GQL,
33
+ PROJECT_ARTIFACT_COLLECTION_GQL,
34
+ PROJECT_ARTIFACT_COLLECTIONS_GQL,
35
+ PROJECT_ARTIFACT_TYPE_GQL,
36
+ PROJECT_ARTIFACT_TYPES_GQL,
37
+ PROJECT_ARTIFACTS_GQL,
38
+ RUN_INPUT_ARTIFACTS_GQL,
39
+ RUN_OUTPUT_ARTIFACTS_GQL,
40
+ UPDATE_ARTIFACT_PORTFOLIO_GQL,
41
+ UPDATE_ARTIFACT_SEQUENCE_GQL,
42
+ ArtifactCollectionMembershipFiles,
43
+ ArtifactCollectionsFragment,
44
+ ArtifactsFragment,
45
+ ArtifactTypeFragment,
46
+ ArtifactTypesFragment,
47
+ ArtifactVersionFiles,
48
+ FilesFragment,
49
+ ProjectArtifactCollection,
50
+ ProjectArtifactCollections,
51
+ ProjectArtifacts,
52
+ ProjectArtifactType,
53
+ ProjectArtifactTypes,
54
+ RunInputArtifactConnectionFragment,
55
+ RunOutputArtifactConnectionFragment,
56
+ )
57
+ from wandb.sdk.artifacts._gqlutils import omit_artifact_fields
58
+ from wandb.sdk.artifacts._validators import (
59
+ SOURCE_ARTIFACT_COLLECTION_TYPE,
60
+ FullArtifactPath,
61
+ validate_artifact_name,
62
+ validate_artifact_type,
63
+ )
64
+ from wandb.sdk.internal.internal_api import Api as InternalApi
65
+ from wandb.sdk.lib import deprecate
66
+
67
+ from .utils import gql_compat
68
+
69
+ if TYPE_CHECKING:
70
+ from wandb.sdk.artifacts.artifact import Artifact
71
+
72
+ from . import RetryingClient, Run
73
+
74
+
75
+ class ArtifactTypes(Paginator["ArtifactType"]):
76
+ """An lazy iterator of `ArtifactType` objects for a specific project.
77
+
78
+ <!-- lazydoc-ignore-init: internal -->
79
+ """
80
+
81
+ QUERY = gql(PROJECT_ARTIFACT_TYPES_GQL)
82
+
83
+ last_response: ArtifactTypesFragment | None
84
+
85
+ def __init__(
86
+ self,
87
+ client: Client,
88
+ entity: str,
89
+ project: str,
90
+ per_page: int = 50,
91
+ ):
92
+ self.entity = entity
93
+ self.project = project
94
+
95
+ variable_values = {
96
+ "entityName": entity,
97
+ "projectName": project,
98
+ }
99
+ super().__init__(client, variable_values, per_page)
100
+
101
+ @override
102
+ def _update_response(self) -> None:
103
+ """Fetch and validate the response data for the current page."""
104
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
105
+ result = ProjectArtifactTypes.model_validate(data)
106
+
107
+ # Extract the inner `*Connection` result for faster/easier access.
108
+ if not ((proj := result.project) and (conn := proj.artifact_types)):
109
+ raise ValueError(f"Unable to parse {nameof(type(self))!r} response data")
110
+
111
+ self.last_response = ArtifactTypesFragment.model_validate(conn)
112
+
113
+ @property
114
+ def _length(self) -> None:
115
+ """Returns `None`.
116
+
117
+ <!-- lazydoc-ignore: internal -->
118
+ """
119
+ # TODO
120
+ return None
121
+
122
+ @property
123
+ def more(self) -> bool:
124
+ """Returns whether there are more artifact types to fetch.
125
+
126
+ <!-- lazydoc-ignore: internal -->
127
+ """
128
+ if self.last_response is None:
129
+ return True
130
+ return self.last_response.page_info.has_next_page
131
+
132
+ @property
133
+ def cursor(self) -> str | None:
134
+ """Returns the cursor for the next page of results.
135
+
136
+ <!-- lazydoc-ignore: internal -->
137
+ """
138
+ if self.last_response is None:
139
+ return None
140
+ return self.last_response.edges[-1].cursor
141
+
142
+ def update_variables(self) -> None:
143
+ """Update the cursor variable for pagination.
144
+
145
+ <!-- lazydoc-ignore: internal -->
146
+ """
147
+ self.variables.update({"cursor": self.cursor})
148
+
149
+ def convert_objects(self) -> list[ArtifactType]:
150
+ """Convert the raw response data into a list of ArtifactType objects.
151
+
152
+ <!-- lazydoc-ignore: internal -->
153
+ """
154
+ if self.last_response is None:
155
+ return []
156
+
157
+ return [
158
+ ArtifactType(
159
+ client=self.client,
160
+ entity=self.entity,
161
+ project=self.project,
162
+ type_name=node.name,
163
+ attrs=node.model_dump(exclude_unset=True),
164
+ )
165
+ for edge in self.last_response.edges
166
+ if edge.node and (node := ArtifactTypeFragment.model_validate(edge.node))
167
+ ]
168
+
169
+
170
+ class ArtifactType:
171
+ """An artifact object that satisfies query based on the specified type.
172
+
173
+ Args:
174
+ client: The client instance to use for querying W&B.
175
+ entity: The entity (user or team) that owns the project.
176
+ project: The name of the project to query for artifact types.
177
+ type_name: The name of the artifact type.
178
+ attrs: Optional mapping of attributes to initialize the artifact type. If not provided,
179
+ the object will load its attributes from W&B upon initialization.
180
+
181
+ <!-- lazydoc-ignore-init: internal -->
182
+ """
183
+
184
+ def __init__(
185
+ self,
186
+ client: Client,
187
+ entity: str,
188
+ project: str,
189
+ type_name: str,
190
+ attrs: Mapping[str, Any] | None = None,
191
+ ):
192
+ self.client = client
193
+ self.entity = entity
194
+ self.project = project
195
+ self.type = type_name
196
+ self._attrs = attrs
197
+ if self._attrs is None:
198
+ self.load()
199
+
200
+ def load(self) -> Mapping[str, Any]:
201
+ """Load the artifact type attributes from W&B.
202
+
203
+ <!-- lazydoc-ignore: internal -->
204
+ """
205
+ data: Mapping[str, Any] | None = self.client.execute(
206
+ gql(PROJECT_ARTIFACT_TYPE_GQL),
207
+ variable_values={
208
+ "entityName": self.entity,
209
+ "projectName": self.project,
210
+ "artifactTypeName": self.type,
211
+ },
212
+ )
213
+ result = ProjectArtifactType.model_validate(data)
214
+ if not ((proj := result.project) and (artifact_type := proj.artifact_type)):
215
+ raise ValueError(f"Could not find artifact type {self.type}")
216
+
217
+ self._attrs = artifact_type.model_dump(exclude_unset=True)
218
+ return self._attrs
219
+
220
+ @property
221
+ def id(self) -> str:
222
+ """The unique identifier of the artifact type."""
223
+ return self._attrs["id"]
224
+
225
+ @property
226
+ def name(self) -> str:
227
+ """The name of the artifact type."""
228
+ return self._attrs["name"]
229
+
230
+ @normalize_exceptions
231
+ def collections(self, per_page: int = 50) -> ArtifactCollections:
232
+ """Get all artifact collections associated with this artifact type.
233
+
234
+ Args:
235
+ per_page (int): The number of artifact collections to fetch per page.
236
+ Default is 50.
237
+ """
238
+ return ArtifactCollections(self.client, self.entity, self.project, self.type)
239
+
240
+ def collection(self, name: str) -> ArtifactCollection:
241
+ """Get a specific artifact collection by name.
242
+
243
+ Args:
244
+ name (str): The name of the artifact collection to retrieve.
245
+ """
246
+ return ArtifactCollection(
247
+ self.client, self.entity, self.project, name, self.type
248
+ )
249
+
250
+ def __repr__(self) -> str:
251
+ return f"<ArtifactType {self.type}>"
252
+
253
+
254
+ class ArtifactCollections(SizedPaginator["ArtifactCollection"]):
255
+ """Artifact collections of a specific type in a project.
256
+
257
+ Args:
258
+ client: The client instance to use for querying W&B.
259
+ entity: The entity (user or team) that owns the project.
260
+ project: The name of the project to query for artifact collections.
261
+ type_name: The name of the artifact type for which to fetch collections.
262
+ per_page: The number of artifact collections to fetch per page. Default is 50.
263
+
264
+ <!-- lazydoc-ignore-init: internal -->
265
+ """
266
+
267
+ last_response: ArtifactCollectionsFragment | None
268
+
269
+ def __init__(
270
+ self,
271
+ client: Client,
272
+ entity: str,
273
+ project: str,
274
+ type_name: str,
275
+ per_page: int = 50,
276
+ ):
277
+ self.entity = entity
278
+ self.project = project
279
+ self.type_name = type_name
280
+
281
+ variable_values = {
282
+ "entityName": entity,
283
+ "projectName": project,
284
+ "artifactTypeName": type_name,
285
+ }
286
+
287
+ if server_supports_artifact_collections_gql_edges(client):
288
+ rename_fields = None
289
+ else:
290
+ rename_fields = {"artifactCollections": "artifactSequences"}
291
+
292
+ self.QUERY = gql_compat(
293
+ PROJECT_ARTIFACT_COLLECTIONS_GQL, rename_fields=rename_fields
294
+ )
295
+
296
+ super().__init__(client, variable_values, per_page)
297
+
298
+ @override
299
+ def _update_response(self) -> None:
300
+ """Fetch and validate the response data for the current page."""
301
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
302
+ result = ProjectArtifactCollections.model_validate(data)
303
+
304
+ # Extract the inner `*Connection` result for faster/easier access.
305
+ if not (
306
+ (proj := result.project)
307
+ and (type_ := proj.artifact_type)
308
+ and (conn := type_.artifact_collections)
309
+ ):
310
+ raise ValueError(f"Unable to parse {nameof(type(self))!r} response data")
311
+
312
+ self.last_response = ArtifactCollectionsFragment.model_validate(conn)
313
+
314
+ @property
315
+ def _length(self) -> int:
316
+ """Returns the total number of artifact collections.
317
+
318
+ <!-- lazydoc-ignore: internal -->
319
+ """
320
+ if self.last_response is None:
321
+ self._load_page()
322
+ return self.last_response.total_count
323
+
324
+ @property
325
+ def more(self):
326
+ """Returns whether there are more artifacts to fetch.
327
+
328
+ <!-- lazydoc-ignore: internal -->
329
+ """
330
+ if self.last_response is None:
331
+ return True
332
+ return self.last_response.page_info.has_next_page
333
+
334
+ @property
335
+ def cursor(self):
336
+ """Returns the cursor for the next page of results.
337
+
338
+ <!-- lazydoc-ignore: internal -->
339
+ """
340
+ if self.last_response is None:
341
+ return None
342
+ return self.last_response.edges[-1].cursor
343
+
344
+ def update_variables(self) -> None:
345
+ """Update the cursor variable for pagination.
346
+
347
+ <!-- lazydoc-ignore: internal -->
348
+ """
349
+ self.variables.update({"cursor": self.cursor})
350
+
351
+ def convert_objects(self) -> list[ArtifactCollection]:
352
+ """Convert the raw response data into a list of ArtifactCollection objects.
353
+
354
+ <!-- lazydoc-ignore: internal -->
355
+ """
356
+ if self.last_response is None:
357
+ return []
358
+ return [
359
+ ArtifactCollection(
360
+ client=self.client,
361
+ entity=self.entity,
362
+ project=self.project,
363
+ name=node.name,
364
+ type=self.type_name,
365
+ )
366
+ for edge in self.last_response.edges
367
+ if (node := edge.node)
368
+ ]
369
+
370
+
371
+ class ArtifactCollection:
372
+ """An artifact collection that represents a group of related artifacts.
373
+
374
+ Args:
375
+ client: The client instance to use for querying W&B.
376
+ entity: The entity (user or team) that owns the project.
377
+ project: The name of the project to query for artifact collections.
378
+ name: The name of the artifact collection.
379
+ type: The type of the artifact collection (e.g., "dataset", "model").
380
+ organization: Optional organization name if applicable.
381
+ attrs: Optional mapping of attributes to initialize the artifact collection.
382
+ If not provided, the object will load its attributes from W&B upon
383
+ initialization.
384
+
385
+ <!-- lazydoc-ignore-init: internal -->
386
+ """
387
+
388
+ def __init__(
389
+ self,
390
+ client: Client,
391
+ entity: str,
392
+ project: str,
393
+ name: str,
394
+ type: str,
395
+ organization: str | None = None,
396
+ attrs: Mapping[str, Any] | None = None,
397
+ is_sequence: bool | None = None,
398
+ ):
399
+ self.client = client
400
+ self.entity = entity
401
+ self.project = project
402
+ self._name = validate_artifact_name(name)
403
+ self._saved_name = name
404
+ self._type = type
405
+ self._saved_type = type
406
+ self._attrs = attrs
407
+ if is_sequence is not None:
408
+ self._is_sequence = is_sequence
409
+ if (attrs is None) or (is_sequence is None):
410
+ self.load()
411
+ self._aliases = [a["node"]["alias"] for a in self._attrs["aliases"]["edges"]]
412
+ self._description = self._attrs["description"]
413
+ self._created_at = self._attrs["createdAt"]
414
+ self._tags = [a["node"]["name"] for a in self._attrs["tags"]["edges"]]
415
+ self._saved_tags = copy(self._tags)
416
+ self.organization = organization
417
+
418
+ @property
419
+ def id(self) -> str:
420
+ """The unique identifier of the artifact collection."""
421
+ return self._attrs["id"]
422
+
423
+ @normalize_exceptions
424
+ def artifacts(self, per_page: int = 50) -> Artifacts:
425
+ """Get all artifacts in the collection."""
426
+ return Artifacts(
427
+ client=self.client,
428
+ entity=self.entity,
429
+ project=self.project,
430
+ collection_name=self._saved_name,
431
+ type=self._saved_type,
432
+ per_page=per_page,
433
+ )
434
+
435
+ @property
436
+ def aliases(self) -> list[str]:
437
+ """Artifact Collection Aliases."""
438
+ return self._aliases
439
+
440
+ @property
441
+ def created_at(self) -> str:
442
+ """The creation date of the artifact collection."""
443
+ return self._created_at
444
+
445
+ def load(self):
446
+ """Load the artifact collection attributes from W&B.
447
+
448
+ <!-- lazydoc-ignore: internal -->
449
+ """
450
+ if server_supports_artifact_collections_gql_edges(self.client):
451
+ rename_fields = None
452
+ else:
453
+ rename_fields = {"artifactCollection": "artifactSequence"}
454
+
455
+ response = self.client.execute(
456
+ gql_compat(PROJECT_ARTIFACT_COLLECTION_GQL, rename_fields=rename_fields),
457
+ variable_values={
458
+ "entityName": self.entity,
459
+ "projectName": self.project,
460
+ "artifactTypeName": self._saved_type,
461
+ "artifactCollectionName": self._saved_name,
462
+ },
463
+ )
464
+
465
+ result = ProjectArtifactCollection.model_validate(response)
466
+
467
+ if not (
468
+ result.project
469
+ and (proj := result.project)
470
+ and (type_ := proj.artifact_type)
471
+ and (collection := type_.artifact_collection)
472
+ ):
473
+ raise ValueError(f"Could not find artifact type {self._saved_type}")
474
+
475
+ sequence = type_.artifact_sequence
476
+ self._is_sequence = (
477
+ sequence is not None
478
+ ) and sequence.typename__ == SOURCE_ARTIFACT_COLLECTION_TYPE
479
+
480
+ if self._attrs is None:
481
+ self._attrs = collection.model_dump(exclude_unset=True)
482
+ return self._attrs
483
+
484
+ @normalize_exceptions
485
+ def change_type(self, new_type: str) -> None:
486
+ """Deprecated, change type directly with `save` instead."""
487
+ deprecate.deprecate(
488
+ field_name=Deprecated.artifact_collection__change_type,
489
+ warning_message="ArtifactCollection.change_type(type) is deprecated, use ArtifactCollection.save() instead.",
490
+ )
491
+
492
+ if self._saved_type != new_type:
493
+ try:
494
+ validate_artifact_type(self._saved_type, self.name)
495
+ except ValueError as e:
496
+ raise ValueError(
497
+ f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
498
+ ) from e
499
+
500
+ # Check that the new type is not going to conflict with internal types
501
+ validate_artifact_type(new_type, self.name)
502
+
503
+ if not self.is_sequence():
504
+ raise ValueError("Artifact collection needs to be a sequence")
505
+ termlog(
506
+ f"Changing artifact collection type of {self._saved_type} to {new_type}"
507
+ )
508
+ self.client.execute(
509
+ gql(MOVE_ARTIFACT_COLLECTION_GQL),
510
+ variable_values={
511
+ "artifactSequenceID": self.id,
512
+ "destinationArtifactTypeName": new_type,
513
+ },
514
+ )
515
+ self._saved_type = new_type
516
+ self._type = new_type
517
+
518
+ def is_sequence(self) -> bool:
519
+ """Return whether the artifact collection is a sequence."""
520
+ return self._is_sequence
521
+
522
+ @normalize_exceptions
523
+ def delete(self) -> None:
524
+ """Delete the entire artifact collection."""
525
+ self.client.execute(
526
+ gql(
527
+ DELETE_ARTIFACT_SEQUENCE_GQL
528
+ if self.is_sequence()
529
+ else DELETE_ARTIFACT_PORTFOLIO_GQL
530
+ ),
531
+ variable_values={"id": self.id},
532
+ )
533
+
534
+ @property
535
+ def description(self) -> str:
536
+ """A description of the artifact collection."""
537
+ return self._description
538
+
539
+ @description.setter
540
+ def description(self, description: str | None) -> None:
541
+ """Set the description of the artifact collection."""
542
+ self._description = description
543
+
544
+ @property
545
+ def tags(self) -> list[str]:
546
+ """The tags associated with the artifact collection."""
547
+ return self._tags
548
+
549
+ @tags.setter
550
+ def tags(self, tags: list[str]) -> None:
551
+ """Set the tags associated with the artifact collection."""
552
+ if any(not re.match(r"^[-\w]+([ ]+[-\w]+)*$", tag) for tag in tags):
553
+ raise ValueError(
554
+ "Tags must only contain alphanumeric characters or underscores separated by spaces or hyphens"
555
+ )
556
+ self._tags = tags
557
+
558
+ @property
559
+ def name(self) -> str:
560
+ """The name of the artifact collection."""
561
+ return self._name
562
+
563
+ @name.setter
564
+ def name(self, name: str) -> None:
565
+ """Set the name of the artifact collection."""
566
+ self._name = validate_artifact_name(name)
567
+
568
+ @property
569
+ def type(self):
570
+ """Returns the type of the artifact collection."""
571
+ return self._type
572
+
573
+ @type.setter
574
+ def type(self, type: list[str]) -> None:
575
+ """Set the type of the artifact collection."""
576
+ if not self.is_sequence():
577
+ raise ValueError(
578
+ "Type can only be changed if the artifact collection is a sequence."
579
+ )
580
+ self._type = type
581
+
582
+ def _update_collection(self) -> None:
583
+ self.client.execute(
584
+ gql(
585
+ UPDATE_ARTIFACT_SEQUENCE_GQL
586
+ if self.is_sequence()
587
+ else UPDATE_ARTIFACT_PORTFOLIO_GQL
588
+ ),
589
+ variable_values={
590
+ "id": self.id,
591
+ "name": self.name,
592
+ "description": self.description,
593
+ },
594
+ )
595
+ self._saved_name = self._name
596
+
597
+ def _update_collection_type(self) -> None:
598
+ self.client.execute(
599
+ gql(MOVE_ARTIFACT_COLLECTION_GQL),
600
+ variable_values={
601
+ "artifactSequenceID": self.id,
602
+ "destinationArtifactTypeName": self.type,
603
+ },
604
+ )
605
+ self._saved_type = self._type
606
+
607
+ def _add_tags(self, tags_to_add: Iterable[str]) -> None:
608
+ self.client.execute(
609
+ gql(CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
610
+ variable_values={
611
+ "entityName": self.entity,
612
+ "projectName": self.project,
613
+ "artifactCollectionName": self._saved_name,
614
+ "tags": [{"tagName": tag} for tag in tags_to_add],
615
+ },
616
+ )
617
+
618
+ def _delete_tags(self, tags_to_delete: Iterable[str]) -> None:
619
+ self.client.execute(
620
+ gql(DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
621
+ variable_values={
622
+ "entityName": self.entity,
623
+ "projectName": self.project,
624
+ "artifactCollectionName": self._saved_name,
625
+ "tags": [{"tagName": tag} for tag in tags_to_delete],
626
+ },
627
+ )
628
+
629
+ @normalize_exceptions
630
+ def save(self) -> None:
631
+ """Persist any changes made to the artifact collection."""
632
+ if self._saved_type != self.type:
633
+ try:
634
+ validate_artifact_type(self.type, self._name)
635
+ except ValueError as e:
636
+ raise ValueError(f"Failed to save artifact collection: {e}") from e
637
+ try:
638
+ validate_artifact_type(self._saved_type, self._name)
639
+ except ValueError as e:
640
+ raise ValueError(
641
+ f"Failed to save artifact collection '{self._name}': "
642
+ f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
643
+ ) from e
644
+
645
+ self._update_collection()
646
+
647
+ if self.is_sequence() and (self._saved_type != self._type):
648
+ self._update_collection_type()
649
+
650
+ current_tags = set(self._tags)
651
+ saved_tags = set(self._saved_tags)
652
+ if tags_to_add := (current_tags - saved_tags):
653
+ self._add_tags(tags_to_add)
654
+ if tags_to_delete := (saved_tags - current_tags):
655
+ self._delete_tags(tags_to_delete)
656
+ self._saved_tags = copy(self._tags)
657
+
658
+ def __repr__(self) -> str:
659
+ return f"<ArtifactCollection {self._name} ({self._type})>"
660
+
661
+
662
+ class Artifacts(SizedPaginator["Artifact"]):
663
+ """An iterable collection of artifact versions associated with a project.
664
+
665
+ Optionally pass in filters to narrow down the results based on specific criteria.
666
+
667
+ Args:
668
+ client: The client instance to use for querying W&B.
669
+ entity: The entity (user or team) that owns the project.
670
+ project: The name of the project to query for artifacts.
671
+ collection_name: The name of the artifact collection to query.
672
+ type: The type of the artifacts to query. Common examples include
673
+ "dataset" or "model".
674
+ filters: Optional mapping of filters to apply to the query.
675
+ order: Optional string to specify the order of the results.
676
+ per_page: The number of artifact versions to fetch per page. Default is 50.
677
+ tags: Optional string or list of strings to filter artifacts by tags.
678
+
679
+ <!-- lazydoc-ignore-init: internal -->
680
+ """
681
+
682
+ last_response: ArtifactsFragment | None
683
+
684
+ def __init__(
685
+ self,
686
+ client: Client,
687
+ entity: str,
688
+ project: str,
689
+ collection_name: str,
690
+ type: str,
691
+ filters: Mapping[str, Any] | None = None,
692
+ order: str | None = None,
693
+ per_page: int = 50,
694
+ tags: str | list[str] | None = None,
695
+ ):
696
+ self.entity = entity
697
+ self.collection_name = collection_name
698
+ self.type = type
699
+ self.project = project
700
+ self.filters = {"state": "COMMITTED"} if filters is None else filters
701
+ self.tags = [tags] if isinstance(tags, str) else tags
702
+ self.order = order
703
+ variables = {
704
+ "project": self.project,
705
+ "entity": self.entity,
706
+ "order": self.order,
707
+ "type": self.type,
708
+ "collection": self.collection_name,
709
+ "filters": json.dumps(self.filters),
710
+ }
711
+
712
+ if server_supports_artifact_collections_gql_edges(client):
713
+ rename_fields = None
714
+ else:
715
+ rename_fields = {"artifactCollection": "artifactSequence"}
716
+
717
+ self.QUERY = gql_compat(
718
+ PROJECT_ARTIFACTS_GQL,
719
+ omit_fields=omit_artifact_fields(client),
720
+ rename_fields=rename_fields,
721
+ )
722
+
723
+ super().__init__(client, variables, per_page)
724
+
725
+ @override
726
+ def _update_response(self) -> None:
727
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
728
+ result = ProjectArtifacts.model_validate(data)
729
+
730
+ # Extract the inner `*Connection` result for faster/easier access.
731
+ if not (
732
+ (proj := result.project)
733
+ and (type_ := proj.artifact_type)
734
+ and (collection := type_.artifact_collection)
735
+ and (conn := collection.artifacts)
736
+ ):
737
+ raise ValueError(f"Unable to parse {nameof(type(self))!r} response data")
738
+
739
+ self.last_response = ArtifactsFragment.model_validate(conn)
740
+
741
+ @property
742
+ def _length(self) -> int:
743
+ """Returns the total number of artifacts in the collection.
744
+
745
+ <!-- lazydoc-ignore: internal -->
746
+ """
747
+ if self.last_response is None:
748
+ self._load_page()
749
+ return self.last_response.total_count
750
+
751
+ @property
752
+ def more(self) -> bool:
753
+ """Returns whether there are more files to fetch.
754
+
755
+ <!-- lazydoc-ignore: internal -->
756
+ """
757
+ if self.last_response is None:
758
+ return True
759
+ return self.last_response.page_info.has_next_page
760
+
761
+ @property
762
+ def cursor(self) -> str | None:
763
+ """Returns the cursor for the next page of results.
764
+
765
+ <!-- lazydoc-ignore: internal -->
766
+ """
767
+ if self.last_response is None:
768
+ return None
769
+ return self.last_response.edges[-1].cursor
770
+
771
+ def convert_objects(self) -> list[Artifact]:
772
+ """Convert the raw response data into a list of wandb.Artifact objects.
773
+
774
+ <!-- lazydoc-ignore: internal -->
775
+ """
776
+ if self.last_response is None:
777
+ return []
778
+
779
+ artifact_edges = (edge for edge in self.last_response.edges if edge.node)
780
+ artifacts = (
781
+ wandb.Artifact._from_attrs(
782
+ path=FullArtifactPath(
783
+ prefix=self.entity,
784
+ project=self.project,
785
+ name=f"{self.collection_name}:{edge.version}",
786
+ ),
787
+ attrs=edge.node,
788
+ client=self.client,
789
+ )
790
+ for edge in artifact_edges
791
+ )
792
+ required_tags = set(self.tags or [])
793
+ return [art for art in artifacts if required_tags.issubset(art.tags)]
794
+
795
+
796
+ class RunArtifacts(SizedPaginator["Artifact"]):
797
+ """An iterable collection of artifacts associated with a specific run.
798
+
799
+ <!-- lazydoc-ignore-init: internal -->
800
+ """
801
+
802
+ last_response: (
803
+ RunOutputArtifactConnectionFragment | RunInputArtifactConnectionFragment
804
+ )
805
+
806
+ #: The pydantic model used to parse the (inner part of the) raw response.
807
+ _response_cls: type[
808
+ RunOutputArtifactConnectionFragment | RunInputArtifactConnectionFragment
809
+ ]
810
+
811
+ def __init__(
812
+ self,
813
+ client: Client,
814
+ run: Run,
815
+ mode: Literal["logged", "used"] = "logged",
816
+ per_page: int = 50,
817
+ ):
818
+ self.run = run
819
+
820
+ if mode == "logged":
821
+ self.run_key = "outputArtifacts"
822
+ self.QUERY = gql_compat(
823
+ RUN_OUTPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields(client)
824
+ )
825
+ self._response_cls = RunOutputArtifactConnectionFragment
826
+ elif mode == "used":
827
+ self.run_key = "inputArtifacts"
828
+ self.QUERY = gql_compat(
829
+ RUN_INPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields(client)
830
+ )
831
+ self._response_cls = RunInputArtifactConnectionFragment
832
+ else:
833
+ raise ValueError("mode must be logged or used")
834
+
835
+ variable_values = {
836
+ "entity": run.entity,
837
+ "project": run.project,
838
+ "runName": run.id,
839
+ }
840
+ super().__init__(client, variable_values, per_page)
841
+
842
+ @override
843
+ def _update_response(self) -> None:
844
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
845
+
846
+ # Extract the inner `*Connection` result for faster/easier access.
847
+ inner_data = data["project"]["run"][self.run_key]
848
+ self.last_response = self._response_cls.model_validate(inner_data)
849
+
850
+ @property
851
+ def _length(self) -> int:
852
+ """Returns the total number of artifacts in the collection.
853
+
854
+ <!-- lazydoc-ignore: internal -->
855
+ """
856
+ if self.last_response is None:
857
+ self._load_page()
858
+ return self.last_response.total_count
859
+
860
+ @property
861
+ def more(self) -> bool:
862
+ """Returns whether there are more artifacts to fetch.
863
+
864
+ <!-- lazydoc-ignore: internal -->
865
+ """
866
+ if self.last_response is None:
867
+ return True
868
+ return self.last_response.page_info.has_next_page
869
+
870
+ @property
871
+ def cursor(self) -> str | None:
872
+ """Returns the cursor for the next page of results.
873
+
874
+ <!-- lazydoc-ignore: internal -->
875
+ """
876
+ if self.last_response is None:
877
+ return None
878
+ return self.last_response.edges[-1].cursor
879
+
880
+ def convert_objects(self) -> list[Artifact]:
881
+ """Convert the raw response data into a list of wandb.Artifact objects.
882
+
883
+ <!-- lazydoc-ignore: internal -->
884
+ """
885
+ if self.last_response is None:
886
+ return []
887
+
888
+ return [
889
+ wandb.Artifact._from_attrs(
890
+ path=FullArtifactPath(
891
+ prefix=proj.entity_name,
892
+ project=proj.name,
893
+ name=f"{artifact_seq.name}:v{node.version_index}",
894
+ ),
895
+ attrs=node,
896
+ client=self.client,
897
+ )
898
+ for edge in self.last_response.edges
899
+ if (node := edge.node)
900
+ and (artifact_seq := node.artifact_sequence)
901
+ and (proj := artifact_seq.project)
902
+ ]
903
+
904
+
905
+ class ArtifactFiles(SizedPaginator["public.File"]):
906
+ """A paginator for files in an artifact.
907
+
908
+ <!-- lazydoc-ignore-init: internal -->
909
+ """
910
+
911
+ last_response: FilesFragment | None
912
+
913
+ def __init__(
914
+ self,
915
+ client: Client,
916
+ artifact: Artifact,
917
+ names: Sequence[str] | None = None,
918
+ per_page: int = 50,
919
+ ):
920
+ self.query_via_membership = InternalApi()._server_supports(
921
+ ServerFeature.ARTIFACT_COLLECTION_MEMBERSHIP_FILES
922
+ )
923
+ self.artifact = artifact
924
+
925
+ if self.query_via_membership:
926
+ query_str = ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL
927
+ variables = {
928
+ "entityName": artifact.entity,
929
+ "projectName": artifact.project,
930
+ "artifactName": artifact.name.split(":")[0],
931
+ "artifactVersionIndex": artifact.version,
932
+ "fileNames": names,
933
+ }
934
+ else:
935
+ query_str = ARTIFACT_VERSION_FILES_GQL
936
+ variables = {
937
+ "entityName": artifact.source_entity,
938
+ "projectName": artifact.source_project,
939
+ "artifactName": artifact.source_name,
940
+ "artifactTypeName": artifact.type,
941
+ "fileNames": names,
942
+ }
943
+
944
+ # The server must advertise at least SDK 0.12.21
945
+ # to get storagePath
946
+ if not client.version_supported("0.12.21"):
947
+ self.QUERY = gql_compat(query_str, omit_fields={"storagePath"})
948
+ else:
949
+ self.QUERY = gql(query_str)
950
+
951
+ super().__init__(client, variables, per_page)
952
+
953
+ @override
954
+ def _update_response(self) -> None:
955
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
956
+
957
+ # Extract the inner `*Connection` result for faster/easier access.
958
+ if self.query_via_membership:
959
+ result = ArtifactCollectionMembershipFiles.model_validate(data)
960
+ conn = result.project.artifact_collection.artifact_membership.files
961
+ else:
962
+ result = ArtifactVersionFiles.model_validate(data)
963
+ conn = result.project.artifact_type.artifact.files
964
+
965
+ if conn is None:
966
+ raise ValueError(f"Unable to parse {nameof(type(self))!r} response data")
967
+
968
+ self.last_response = FilesFragment.model_validate(conn)
969
+
970
+ @property
971
+ def path(self) -> list[str]:
972
+ """Returns the path of the artifact."""
973
+ return [self.artifact.entity, self.artifact.project, self.artifact.name]
974
+
975
+ @property
976
+ def _length(self) -> int:
977
+ if self.last_response is None:
978
+ self._load_page()
979
+ """Returns the total number of files in the artifact.
980
+
981
+ <!-- lazydoc-ignore: internal -->
982
+ """
983
+ return self.artifact.file_count
984
+
985
+ @property
986
+ def more(self) -> bool:
987
+ """Returns whether there are more files to fetch.
988
+
989
+ <!-- lazydoc-ignore: internal -->
990
+ """
991
+ if self.last_response is None:
992
+ return True
993
+ return self.last_response.page_info.has_next_page
994
+
995
+ @property
996
+ def cursor(self) -> str | None:
997
+ """Returns the cursor for the next page of results.
998
+
999
+ <!-- lazydoc-ignore: internal -->
1000
+ """
1001
+ if self.last_response is None:
1002
+ return None
1003
+ return self.last_response.edges[-1].cursor
1004
+
1005
+ def update_variables(self) -> None:
1006
+ """Update the variables dictionary with the cursor.
1007
+
1008
+ <!-- lazydoc-ignore: internal -->
1009
+ """
1010
+ self.variables.update({"fileLimit": self.per_page, "fileCursor": self.cursor})
1011
+
1012
+ def convert_objects(self) -> list[public.File]:
1013
+ """Convert the raw response data into a list of public.File objects.
1014
+
1015
+ <!-- lazydoc-ignore: internal -->
1016
+ """
1017
+ if self.last_response is None:
1018
+ return []
1019
+
1020
+ return [
1021
+ public.File(
1022
+ client=self.client,
1023
+ attrs=node.model_dump(exclude_unset=True),
1024
+ )
1025
+ for edge in self.last_response.edges
1026
+ if (node := edge.node)
1027
+ ]
1028
+
1029
+ def __repr__(self) -> str:
1030
+ path_str = "/".join(self.path)
1031
+ return f"<ArtifactFiles {path_str} ({len(self)})>"
1032
+
1033
+
1034
+ def server_supports_artifact_collections_gql_edges(
1035
+ client: RetryingClient, warn: bool = False
1036
+ ) -> bool:
1037
+ """Check if W&B server supports GraphQL edges for artifact collections.
1038
+
1039
+ <!-- lazydoc-ignore-function: internal -->
1040
+ """
1041
+ # TODO: Validate this version
1042
+ # Edges were merged into core on Mar 2, 2022: https://github.com/wandb/core/commit/81c90b29eaacfe0a96dc1ebd83c53560ca763e8b
1043
+ # CLI version was bumped to "0.12.11" on Mar 3, 2022: https://github.com/wandb/core/commit/328396fa7c89a2178d510a1be9c0d4451f350d7b
1044
+ supported = client.version_supported("0.12.11") # edges were merged on
1045
+ if not supported and warn:
1046
+ # First local release to include the above is 0.9.50: https://github.com/wandb/local/releases/tag/0.9.50
1047
+ wandb.termwarn(
1048
+ "W&B Local Server version does not support ArtifactCollection gql edges; falling back to using legacy ArtifactSequence. Please update server to at least version 0.9.50."
1049
+ )
1050
+ return supported