wandb 0.21.2__py3-none-macosx_12_0_x86_64.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 (904) 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/_iterutils.py +65 -0
  6. wandb/_pydantic/__init__.py +30 -0
  7. wandb/_pydantic/base.py +128 -0
  8. wandb/_pydantic/utils.py +80 -0
  9. wandb/_pydantic/v1_compat.py +284 -0
  10. wandb/agents/__init__.py +0 -0
  11. wandb/agents/pyagent.py +386 -0
  12. wandb/analytics/__init__.py +3 -0
  13. wandb/analytics/sentry.py +267 -0
  14. wandb/apis/__init__.py +48 -0
  15. wandb/apis/attrs.py +50 -0
  16. wandb/apis/importers/__init__.py +1 -0
  17. wandb/apis/importers/internals/internal.py +382 -0
  18. wandb/apis/importers/internals/protocols.py +103 -0
  19. wandb/apis/importers/internals/util.py +78 -0
  20. wandb/apis/importers/mlflow.py +254 -0
  21. wandb/apis/importers/validation.py +108 -0
  22. wandb/apis/importers/wandb.py +1608 -0
  23. wandb/apis/internal.py +239 -0
  24. wandb/apis/normalize.py +81 -0
  25. wandb/apis/paginator.py +138 -0
  26. wandb/apis/public/__init__.py +35 -0
  27. wandb/apis/public/api.py +2449 -0
  28. wandb/apis/public/artifacts.py +1046 -0
  29. wandb/apis/public/automations.py +85 -0
  30. wandb/apis/public/const.py +4 -0
  31. wandb/apis/public/files.py +402 -0
  32. wandb/apis/public/history.py +201 -0
  33. wandb/apis/public/integrations.py +203 -0
  34. wandb/apis/public/jobs.py +742 -0
  35. wandb/apis/public/projects.py +276 -0
  36. wandb/apis/public/query_generator.py +176 -0
  37. wandb/apis/public/registries/__init__.py +0 -0
  38. wandb/apis/public/registries/_freezable_list.py +179 -0
  39. wandb/apis/public/registries/_utils.py +138 -0
  40. wandb/apis/public/registries/registries_search.py +347 -0
  41. wandb/apis/public/registries/registry.py +358 -0
  42. wandb/apis/public/reports.py +595 -0
  43. wandb/apis/public/runs.py +1216 -0
  44. wandb/apis/public/sweeps.py +440 -0
  45. wandb/apis/public/teams.py +235 -0
  46. wandb/apis/public/users.py +177 -0
  47. wandb/apis/public/utils.py +210 -0
  48. wandb/apis/reports/__init__.py +1 -0
  49. wandb/apis/reports/v1/__init__.py +8 -0
  50. wandb/apis/reports/v2/__init__.py +8 -0
  51. wandb/apis/workspaces/__init__.py +8 -0
  52. wandb/automations/__init__.py +73 -0
  53. wandb/automations/_filters/__init__.py +40 -0
  54. wandb/automations/_filters/expressions.py +181 -0
  55. wandb/automations/_filters/operators.py +258 -0
  56. wandb/automations/_filters/run_metrics.py +330 -0
  57. wandb/automations/_generated/__init__.py +177 -0
  58. wandb/automations/_generated/create_automation.py +17 -0
  59. wandb/automations/_generated/create_generic_webhook_integration.py +43 -0
  60. wandb/automations/_generated/delete_automation.py +15 -0
  61. wandb/automations/_generated/enums.py +35 -0
  62. wandb/automations/_generated/fragments.py +358 -0
  63. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
  64. wandb/automations/_generated/get_automations.py +24 -0
  65. wandb/automations/_generated/get_automations_by_entity.py +26 -0
  66. wandb/automations/_generated/input_types.py +104 -0
  67. wandb/automations/_generated/integrations_by_entity.py +22 -0
  68. wandb/automations/_generated/operations.py +647 -0
  69. wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
  70. wandb/automations/_generated/update_automation.py +17 -0
  71. wandb/automations/_utils.py +235 -0
  72. wandb/automations/_validators.py +165 -0
  73. wandb/automations/actions.py +218 -0
  74. wandb/automations/automations.py +85 -0
  75. wandb/automations/events.py +285 -0
  76. wandb/automations/integrations.py +45 -0
  77. wandb/automations/scopes.py +78 -0
  78. wandb/beta/workflows.py +324 -0
  79. wandb/bin/gpu_stats +0 -0
  80. wandb/bin/wandb-core +0 -0
  81. wandb/cli/__init__.py +0 -0
  82. wandb/cli/beta.py +175 -0
  83. wandb/cli/cli.py +2883 -0
  84. wandb/data_types.py +66 -0
  85. wandb/docker/__init__.py +290 -0
  86. wandb/docker/names.py +40 -0
  87. wandb/docker/wandb-entrypoint.sh +33 -0
  88. wandb/env.py +535 -0
  89. wandb/errors/__init__.py +17 -0
  90. wandb/errors/errors.py +40 -0
  91. wandb/errors/links.py +73 -0
  92. wandb/errors/term.py +415 -0
  93. wandb/errors/util.py +57 -0
  94. wandb/errors/warnings.py +2 -0
  95. wandb/filesync/__init__.py +0 -0
  96. wandb/filesync/dir_watcher.py +404 -0
  97. wandb/filesync/stats.py +100 -0
  98. wandb/filesync/step_checksum.py +142 -0
  99. wandb/filesync/step_prepare.py +179 -0
  100. wandb/filesync/step_upload.py +287 -0
  101. wandb/filesync/upload_job.py +142 -0
  102. wandb/integration/__init__.py +0 -0
  103. wandb/integration/catboost/__init__.py +5 -0
  104. wandb/integration/catboost/catboost.py +182 -0
  105. wandb/integration/cohere/__init__.py +3 -0
  106. wandb/integration/cohere/cohere.py +21 -0
  107. wandb/integration/cohere/resolver.py +347 -0
  108. wandb/integration/diffusers/__init__.py +3 -0
  109. wandb/integration/diffusers/autologger.py +76 -0
  110. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  111. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  112. wandb/integration/diffusers/resolvers/multimodal.py +881 -0
  113. wandb/integration/diffusers/resolvers/utils.py +102 -0
  114. wandb/integration/fastai/__init__.py +243 -0
  115. wandb/integration/gym/__init__.py +98 -0
  116. wandb/integration/huggingface/__init__.py +3 -0
  117. wandb/integration/huggingface/huggingface.py +18 -0
  118. wandb/integration/huggingface/resolver.py +213 -0
  119. wandb/integration/keras/__init__.py +11 -0
  120. wandb/integration/keras/callbacks/__init__.py +5 -0
  121. wandb/integration/keras/callbacks/metrics_logger.py +129 -0
  122. wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
  123. wandb/integration/keras/callbacks/tables_builder.py +228 -0
  124. wandb/integration/keras/keras.py +1086 -0
  125. wandb/integration/kfp/__init__.py +6 -0
  126. wandb/integration/kfp/helpers.py +28 -0
  127. wandb/integration/kfp/kfp_patch.py +335 -0
  128. wandb/integration/kfp/wandb_logging.py +182 -0
  129. wandb/integration/langchain/__init__.py +3 -0
  130. wandb/integration/langchain/wandb_tracer.py +49 -0
  131. wandb/integration/lightgbm/__init__.py +239 -0
  132. wandb/integration/lightning/__init__.py +0 -0
  133. wandb/integration/lightning/fabric/__init__.py +3 -0
  134. wandb/integration/lightning/fabric/logger.py +763 -0
  135. wandb/integration/metaflow/__init__.py +9 -0
  136. wandb/integration/metaflow/data_pandas.py +74 -0
  137. wandb/integration/metaflow/data_pytorch.py +75 -0
  138. wandb/integration/metaflow/data_sklearn.py +76 -0
  139. wandb/integration/metaflow/errors.py +13 -0
  140. wandb/integration/metaflow/metaflow.py +327 -0
  141. wandb/integration/openai/__init__.py +3 -0
  142. wandb/integration/openai/fine_tuning.py +480 -0
  143. wandb/integration/openai/openai.py +22 -0
  144. wandb/integration/openai/resolver.py +240 -0
  145. wandb/integration/prodigy/__init__.py +3 -0
  146. wandb/integration/prodigy/prodigy.py +291 -0
  147. wandb/integration/sacred/__init__.py +117 -0
  148. wandb/integration/sagemaker/__init__.py +14 -0
  149. wandb/integration/sagemaker/auth.py +29 -0
  150. wandb/integration/sagemaker/config.py +58 -0
  151. wandb/integration/sagemaker/files.py +2 -0
  152. wandb/integration/sagemaker/resources.py +63 -0
  153. wandb/integration/sb3/__init__.py +3 -0
  154. wandb/integration/sb3/sb3.py +147 -0
  155. wandb/integration/sklearn/__init__.py +37 -0
  156. wandb/integration/sklearn/calculate/__init__.py +32 -0
  157. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  158. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  159. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  160. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  161. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  162. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  163. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  164. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  165. wandb/integration/sklearn/calculate/residuals.py +86 -0
  166. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  167. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  168. wandb/integration/sklearn/plot/__init__.py +35 -0
  169. wandb/integration/sklearn/plot/classifier.py +329 -0
  170. wandb/integration/sklearn/plot/clusterer.py +146 -0
  171. wandb/integration/sklearn/plot/regressor.py +121 -0
  172. wandb/integration/sklearn/plot/shared.py +91 -0
  173. wandb/integration/sklearn/utils.py +184 -0
  174. wandb/integration/tensorboard/__init__.py +10 -0
  175. wandb/integration/tensorboard/log.py +351 -0
  176. wandb/integration/tensorboard/monkeypatch.py +186 -0
  177. wandb/integration/tensorflow/__init__.py +5 -0
  178. wandb/integration/tensorflow/estimator_hook.py +54 -0
  179. wandb/integration/torch/__init__.py +0 -0
  180. wandb/integration/torch/wandb_torch.py +554 -0
  181. wandb/integration/ultralytics/__init__.py +11 -0
  182. wandb/integration/ultralytics/bbox_utils.py +215 -0
  183. wandb/integration/ultralytics/callback.py +528 -0
  184. wandb/integration/ultralytics/classification_utils.py +83 -0
  185. wandb/integration/ultralytics/mask_utils.py +202 -0
  186. wandb/integration/ultralytics/pose_utils.py +103 -0
  187. wandb/integration/weave/__init__.py +6 -0
  188. wandb/integration/weave/interface.py +49 -0
  189. wandb/integration/weave/weave.py +63 -0
  190. wandb/integration/xgboost/__init__.py +11 -0
  191. wandb/integration/xgboost/xgboost.py +189 -0
  192. wandb/integration/yolov8/__init__.py +0 -0
  193. wandb/integration/yolov8/yolov8.py +284 -0
  194. wandb/jupyter.py +538 -0
  195. wandb/mpmain/__init__.py +0 -0
  196. wandb/mpmain/__main__.py +1 -0
  197. wandb/old/__init__.py +0 -0
  198. wandb/old/core.py +53 -0
  199. wandb/old/settings.py +176 -0
  200. wandb/old/summary.py +438 -0
  201. wandb/plot/__init__.py +30 -0
  202. wandb/plot/bar.py +71 -0
  203. wandb/plot/confusion_matrix.py +185 -0
  204. wandb/plot/custom_chart.py +147 -0
  205. wandb/plot/histogram.py +66 -0
  206. wandb/plot/line.py +75 -0
  207. wandb/plot/line_series.py +173 -0
  208. wandb/plot/pr_curve.py +186 -0
  209. wandb/plot/roc_curve.py +163 -0
  210. wandb/plot/scatter.py +66 -0
  211. wandb/plot/utils.py +184 -0
  212. wandb/plot/viz.py +41 -0
  213. wandb/proto/__init__.py +0 -0
  214. wandb/proto/v3/__init__.py +0 -0
  215. wandb/proto/v3/wandb_base_pb2.py +55 -0
  216. wandb/proto/v3/wandb_internal_pb2.py +1728 -0
  217. wandb/proto/v3/wandb_server_pb2.py +228 -0
  218. wandb/proto/v3/wandb_settings_pb2.py +122 -0
  219. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  220. wandb/proto/v4/__init__.py +0 -0
  221. wandb/proto/v4/wandb_base_pb2.py +30 -0
  222. wandb/proto/v4/wandb_internal_pb2.py +382 -0
  223. wandb/proto/v4/wandb_server_pb2.py +67 -0
  224. wandb/proto/v4/wandb_settings_pb2.py +47 -0
  225. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  226. wandb/proto/v5/wandb_base_pb2.py +31 -0
  227. wandb/proto/v5/wandb_internal_pb2.py +383 -0
  228. wandb/proto/v5/wandb_server_pb2.py +68 -0
  229. wandb/proto/v5/wandb_settings_pb2.py +48 -0
  230. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  231. wandb/proto/v6/wandb_base_pb2.py +41 -0
  232. wandb/proto/v6/wandb_internal_pb2.py +393 -0
  233. wandb/proto/v6/wandb_server_pb2.py +78 -0
  234. wandb/proto/v6/wandb_settings_pb2.py +58 -0
  235. wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
  236. wandb/proto/wandb_base_pb2.py +12 -0
  237. wandb/proto/wandb_deprecated.py +59 -0
  238. wandb/proto/wandb_generate_deprecated.py +30 -0
  239. wandb/proto/wandb_generate_proto.py +49 -0
  240. wandb/proto/wandb_internal_pb2.py +18 -0
  241. wandb/proto/wandb_server_pb2.py +12 -0
  242. wandb/proto/wandb_settings_pb2.py +12 -0
  243. wandb/proto/wandb_telemetry_pb2.py +12 -0
  244. wandb/py.typed +0 -0
  245. wandb/sdk/__init__.py +37 -0
  246. wandb/sdk/artifacts/__init__.py +0 -0
  247. wandb/sdk/artifacts/_factories.py +17 -0
  248. wandb/sdk/artifacts/_generated/__init__.py +508 -0
  249. wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
  250. wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
  251. wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
  252. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
  253. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
  254. wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
  255. wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
  256. wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
  257. wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
  258. wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
  259. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
  260. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
  261. wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
  262. wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
  263. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
  264. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
  265. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
  266. wandb/sdk/artifacts/_generated/enums.py +22 -0
  267. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
  268. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
  269. wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
  270. wandb/sdk/artifacts/_generated/fragments.py +459 -0
  271. wandb/sdk/artifacts/_generated/input_types.py +46 -0
  272. wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
  273. wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
  274. wandb/sdk/artifacts/_generated/operations.py +1223 -0
  275. wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
  276. wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
  277. wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
  278. wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
  279. wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
  280. wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
  281. wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
  282. wandb/sdk/artifacts/_generated/run_input_artifacts.py +51 -0
  283. wandb/sdk/artifacts/_generated/run_output_artifacts.py +51 -0
  284. wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
  285. wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
  286. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
  287. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
  288. wandb/sdk/artifacts/_graphql_fragments.py +19 -0
  289. wandb/sdk/artifacts/_internal_artifact.py +54 -0
  290. wandb/sdk/artifacts/_validators.py +309 -0
  291. wandb/sdk/artifacts/artifact.py +2702 -0
  292. wandb/sdk/artifacts/artifact_download_logger.py +45 -0
  293. wandb/sdk/artifacts/artifact_file_cache.py +251 -0
  294. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  295. wandb/sdk/artifacts/artifact_manifest.py +76 -0
  296. wandb/sdk/artifacts/artifact_manifest_entry.py +258 -0
  297. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  298. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
  299. wandb/sdk/artifacts/artifact_saver.py +277 -0
  300. wandb/sdk/artifacts/artifact_state.py +13 -0
  301. wandb/sdk/artifacts/artifact_ttl.py +9 -0
  302. wandb/sdk/artifacts/exceptions.py +71 -0
  303. wandb/sdk/artifacts/staging.py +27 -0
  304. wandb/sdk/artifacts/storage_handler.py +62 -0
  305. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  306. wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
  307. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
  308. wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
  309. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
  310. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  311. wandb/sdk/artifacts/storage_handlers/s3_handler.py +339 -0
  312. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
  313. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
  314. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  315. wandb/sdk/artifacts/storage_layout.py +8 -0
  316. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  317. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  318. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +580 -0
  319. wandb/sdk/artifacts/storage_policy.py +75 -0
  320. wandb/sdk/backend/__init__.py +0 -0
  321. wandb/sdk/backend/backend.py +57 -0
  322. wandb/sdk/data_types/__init__.py +0 -0
  323. wandb/sdk/data_types/_dtypes.py +914 -0
  324. wandb/sdk/data_types/_private.py +10 -0
  325. wandb/sdk/data_types/audio.py +208 -0
  326. wandb/sdk/data_types/base_types/__init__.py +0 -0
  327. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  328. wandb/sdk/data_types/base_types/media.py +339 -0
  329. wandb/sdk/data_types/base_types/wb_value.py +295 -0
  330. wandb/sdk/data_types/bokeh.py +87 -0
  331. wandb/sdk/data_types/graph.py +439 -0
  332. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  333. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
  334. wandb/sdk/data_types/helper_types/classes.py +159 -0
  335. wandb/sdk/data_types/helper_types/image_mask.py +251 -0
  336. wandb/sdk/data_types/histogram.py +107 -0
  337. wandb/sdk/data_types/html.py +165 -0
  338. wandb/sdk/data_types/image.py +974 -0
  339. wandb/sdk/data_types/molecule.py +250 -0
  340. wandb/sdk/data_types/object_3d.py +495 -0
  341. wandb/sdk/data_types/plotly.py +95 -0
  342. wandb/sdk/data_types/saved_model.py +435 -0
  343. wandb/sdk/data_types/table.py +1468 -0
  344. wandb/sdk/data_types/table_decorators.py +108 -0
  345. wandb/sdk/data_types/trace_tree.py +440 -0
  346. wandb/sdk/data_types/utils.py +260 -0
  347. wandb/sdk/data_types/video.py +303 -0
  348. wandb/sdk/integration_utils/__init__.py +0 -0
  349. wandb/sdk/integration_utils/auto_logging.py +232 -0
  350. wandb/sdk/integration_utils/data_logging.py +475 -0
  351. wandb/sdk/interface/__init__.py +0 -0
  352. wandb/sdk/interface/constants.py +4 -0
  353. wandb/sdk/interface/interface.py +1056 -0
  354. wandb/sdk/interface/interface_queue.py +40 -0
  355. wandb/sdk/interface/interface_shared.py +471 -0
  356. wandb/sdk/interface/interface_sock.py +49 -0
  357. wandb/sdk/interface/summary_record.py +67 -0
  358. wandb/sdk/internal/__init__.py +0 -0
  359. wandb/sdk/internal/_generated/__init__.py +15 -0
  360. wandb/sdk/internal/_generated/enums.py +4 -0
  361. wandb/sdk/internal/_generated/input_types.py +4 -0
  362. wandb/sdk/internal/_generated/operations.py +15 -0
  363. wandb/sdk/internal/_generated/server_features_query.py +27 -0
  364. wandb/sdk/internal/context.py +89 -0
  365. wandb/sdk/internal/datastore.py +293 -0
  366. wandb/sdk/internal/file_pusher.py +177 -0
  367. wandb/sdk/internal/file_stream.py +686 -0
  368. wandb/sdk/internal/handler.py +854 -0
  369. wandb/sdk/internal/incremental_table_util.py +53 -0
  370. wandb/sdk/internal/internal_api.py +4723 -0
  371. wandb/sdk/internal/job_builder.py +639 -0
  372. wandb/sdk/internal/profiler.py +79 -0
  373. wandb/sdk/internal/progress.py +77 -0
  374. wandb/sdk/internal/run.py +27 -0
  375. wandb/sdk/internal/sample.py +70 -0
  376. wandb/sdk/internal/sender.py +1692 -0
  377. wandb/sdk/internal/sender_config.py +203 -0
  378. wandb/sdk/internal/settings_static.py +120 -0
  379. wandb/sdk/internal/tb_watcher.py +519 -0
  380. wandb/sdk/internal/thread_local_settings.py +18 -0
  381. wandb/sdk/launch/__init__.py +15 -0
  382. wandb/sdk/launch/_launch.py +331 -0
  383. wandb/sdk/launch/_launch_add.py +255 -0
  384. wandb/sdk/launch/_project_spec.py +565 -0
  385. wandb/sdk/launch/agent/__init__.py +5 -0
  386. wandb/sdk/launch/agent/agent.py +931 -0
  387. wandb/sdk/launch/agent/config.py +296 -0
  388. wandb/sdk/launch/agent/job_status_tracker.py +55 -0
  389. wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
  390. wandb/sdk/launch/builder/__init__.py +0 -0
  391. wandb/sdk/launch/builder/abstract.py +156 -0
  392. wandb/sdk/launch/builder/build.py +296 -0
  393. wandb/sdk/launch/builder/context_manager.py +235 -0
  394. wandb/sdk/launch/builder/docker_builder.py +177 -0
  395. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  396. wandb/sdk/launch/builder/noop.py +58 -0
  397. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  398. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  399. wandb/sdk/launch/create_job.py +541 -0
  400. wandb/sdk/launch/environment/abstract.py +29 -0
  401. wandb/sdk/launch/environment/aws_environment.py +322 -0
  402. wandb/sdk/launch/environment/azure_environment.py +105 -0
  403. wandb/sdk/launch/environment/gcp_environment.py +334 -0
  404. wandb/sdk/launch/environment/local_environment.py +65 -0
  405. wandb/sdk/launch/errors.py +13 -0
  406. wandb/sdk/launch/git_reference.py +109 -0
  407. wandb/sdk/launch/inputs/files.py +148 -0
  408. wandb/sdk/launch/inputs/internal.py +314 -0
  409. wandb/sdk/launch/inputs/manage.py +113 -0
  410. wandb/sdk/launch/inputs/schema.py +40 -0
  411. wandb/sdk/launch/loader.py +249 -0
  412. wandb/sdk/launch/registry/abstract.py +48 -0
  413. wandb/sdk/launch/registry/anon.py +29 -0
  414. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  415. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  416. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  417. wandb/sdk/launch/registry/local_registry.py +65 -0
  418. wandb/sdk/launch/runner/__init__.py +0 -0
  419. wandb/sdk/launch/runner/abstract.py +185 -0
  420. wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
  421. wandb/sdk/launch/runner/kubernetes_runner.py +1285 -0
  422. wandb/sdk/launch/runner/local_container.py +301 -0
  423. wandb/sdk/launch/runner/local_process.py +78 -0
  424. wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
  425. wandb/sdk/launch/runner/vertex_runner.py +225 -0
  426. wandb/sdk/launch/sweeps/__init__.py +37 -0
  427. wandb/sdk/launch/sweeps/scheduler.py +739 -0
  428. wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
  429. wandb/sdk/launch/sweeps/utils.py +324 -0
  430. wandb/sdk/launch/utils.py +746 -0
  431. wandb/sdk/launch/wandb_reference.py +138 -0
  432. wandb/sdk/lib/__init__.py +5 -0
  433. wandb/sdk/lib/apikey.py +334 -0
  434. wandb/sdk/lib/asyncio_compat.py +213 -0
  435. wandb/sdk/lib/asyncio_manager.py +252 -0
  436. wandb/sdk/lib/capped_dict.py +26 -0
  437. wandb/sdk/lib/config_util.py +101 -0
  438. wandb/sdk/lib/console_capture.py +219 -0
  439. wandb/sdk/lib/credentials.py +141 -0
  440. wandb/sdk/lib/deprecate.py +27 -0
  441. wandb/sdk/lib/disabled.py +30 -0
  442. wandb/sdk/lib/exit_hooks.py +54 -0
  443. wandb/sdk/lib/file_stream_utils.py +118 -0
  444. wandb/sdk/lib/filenames.py +64 -0
  445. wandb/sdk/lib/filesystem.py +372 -0
  446. wandb/sdk/lib/fsm.py +165 -0
  447. wandb/sdk/lib/gitlib.py +240 -0
  448. wandb/sdk/lib/gql_request.py +65 -0
  449. wandb/sdk/lib/handler_util.py +21 -0
  450. wandb/sdk/lib/hashutil.py +106 -0
  451. wandb/sdk/lib/import_hooks.py +275 -0
  452. wandb/sdk/lib/interrupt.py +37 -0
  453. wandb/sdk/lib/ipython.py +126 -0
  454. wandb/sdk/lib/json_util.py +75 -0
  455. wandb/sdk/lib/lazyloader.py +63 -0
  456. wandb/sdk/lib/module.py +72 -0
  457. wandb/sdk/lib/paths.py +106 -0
  458. wandb/sdk/lib/preinit.py +42 -0
  459. wandb/sdk/lib/printer.py +571 -0
  460. wandb/sdk/lib/printer_asyncio.py +48 -0
  461. wandb/sdk/lib/progress.py +320 -0
  462. wandb/sdk/lib/proto_util.py +90 -0
  463. wandb/sdk/lib/redirect.py +876 -0
  464. wandb/sdk/lib/retry.py +395 -0
  465. wandb/sdk/lib/run_moment.py +82 -0
  466. wandb/sdk/lib/runid.py +12 -0
  467. wandb/sdk/lib/server.py +58 -0
  468. wandb/sdk/lib/service/ipc_support.py +13 -0
  469. wandb/sdk/lib/service/service_client.py +106 -0
  470. wandb/sdk/lib/service/service_connection.py +192 -0
  471. wandb/sdk/lib/service/service_port_file.py +105 -0
  472. wandb/sdk/lib/service/service_process.py +111 -0
  473. wandb/sdk/lib/service/service_token.py +181 -0
  474. wandb/sdk/lib/sparkline.py +44 -0
  475. wandb/sdk/lib/telemetry.py +100 -0
  476. wandb/sdk/lib/timed_input.py +133 -0
  477. wandb/sdk/lib/timer.py +19 -0
  478. wandb/sdk/lib/wb_logging.py +161 -0
  479. wandb/sdk/mailbox/__init__.py +23 -0
  480. wandb/sdk/mailbox/mailbox.py +143 -0
  481. wandb/sdk/mailbox/mailbox_handle.py +132 -0
  482. wandb/sdk/mailbox/response_handle.py +99 -0
  483. wandb/sdk/mailbox/wait_with_progress.py +100 -0
  484. wandb/sdk/projects/_generated/__init__.py +47 -0
  485. wandb/sdk/projects/_generated/delete_project.py +22 -0
  486. wandb/sdk/projects/_generated/enums.py +4 -0
  487. wandb/sdk/projects/_generated/fetch_registry.py +22 -0
  488. wandb/sdk/projects/_generated/fragments.py +41 -0
  489. wandb/sdk/projects/_generated/input_types.py +13 -0
  490. wandb/sdk/projects/_generated/operations.py +88 -0
  491. wandb/sdk/projects/_generated/rename_project.py +27 -0
  492. wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
  493. wandb/sdk/verify/__init__.py +0 -0
  494. wandb/sdk/verify/verify.py +555 -0
  495. wandb/sdk/wandb_alerts.py +12 -0
  496. wandb/sdk/wandb_config.py +323 -0
  497. wandb/sdk/wandb_helper.py +54 -0
  498. wandb/sdk/wandb_init.py +1581 -0
  499. wandb/sdk/wandb_login.py +332 -0
  500. wandb/sdk/wandb_metric.py +112 -0
  501. wandb/sdk/wandb_require.py +88 -0
  502. wandb/sdk/wandb_require_helpers.py +44 -0
  503. wandb/sdk/wandb_run.py +4088 -0
  504. wandb/sdk/wandb_settings.py +2105 -0
  505. wandb/sdk/wandb_setup.py +560 -0
  506. wandb/sdk/wandb_summary.py +150 -0
  507. wandb/sdk/wandb_sweep.py +120 -0
  508. wandb/sdk/wandb_sync.py +71 -0
  509. wandb/sdk/wandb_watch.py +146 -0
  510. wandb/sklearn.py +35 -0
  511. wandb/sync/__init__.py +3 -0
  512. wandb/sync/sync.py +452 -0
  513. wandb/trigger.py +29 -0
  514. wandb/util.py +2040 -0
  515. wandb/vendor/__init__.py +0 -0
  516. wandb/vendor/gql-0.2.0/setup.py +40 -0
  517. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  518. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  519. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  520. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  521. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  522. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  523. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  524. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  525. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  526. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  527. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  528. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  529. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  530. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  531. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  532. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  533. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  534. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  535. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  536. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  537. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  538. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  539. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  540. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  541. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  542. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  543. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  544. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  545. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  546. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  547. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  548. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  549. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  550. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  555. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  556. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  557. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  558. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  559. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  560. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  561. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  562. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  563. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  564. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  565. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  566. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  567. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  568. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  569. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  570. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  571. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  572. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  573. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  574. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  575. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  576. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  577. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  578. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  579. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  580. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  581. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  582. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  583. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  584. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  585. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  586. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  587. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  588. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  589. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  590. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  591. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  592. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  593. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  594. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  595. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  596. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  597. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  598. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  599. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  600. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  601. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  602. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  603. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  604. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  605. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  606. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  607. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  608. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  609. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  610. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  611. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  612. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  613. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  614. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  615. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  616. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  617. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  618. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  619. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  620. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  621. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  622. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  623. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  624. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  625. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  626. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  627. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  628. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  629. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  630. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  631. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  632. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  633. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  634. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  635. wandb/vendor/promise-2.3.0/setup.py +64 -0
  636. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  637. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  638. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  639. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  640. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  641. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  642. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  643. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  644. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  645. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  646. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  647. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  648. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  649. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  650. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  651. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  652. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  653. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  654. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  655. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  656. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  657. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  658. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  659. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  660. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  661. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  662. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  663. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  664. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  665. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  666. wandb/vendor/pygments/__init__.py +90 -0
  667. wandb/vendor/pygments/cmdline.py +568 -0
  668. wandb/vendor/pygments/console.py +74 -0
  669. wandb/vendor/pygments/filter.py +74 -0
  670. wandb/vendor/pygments/filters/__init__.py +350 -0
  671. wandb/vendor/pygments/formatter.py +95 -0
  672. wandb/vendor/pygments/formatters/__init__.py +153 -0
  673. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  674. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  675. wandb/vendor/pygments/formatters/html.py +851 -0
  676. wandb/vendor/pygments/formatters/img.py +600 -0
  677. wandb/vendor/pygments/formatters/irc.py +182 -0
  678. wandb/vendor/pygments/formatters/latex.py +482 -0
  679. wandb/vendor/pygments/formatters/other.py +160 -0
  680. wandb/vendor/pygments/formatters/rtf.py +147 -0
  681. wandb/vendor/pygments/formatters/svg.py +153 -0
  682. wandb/vendor/pygments/formatters/terminal.py +136 -0
  683. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  684. wandb/vendor/pygments/lexer.py +871 -0
  685. wandb/vendor/pygments/lexers/__init__.py +329 -0
  686. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  687. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  688. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  689. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  690. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  691. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  692. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  693. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  694. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  695. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  696. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  697. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  698. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  699. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  700. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  701. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  702. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  703. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  704. wandb/vendor/pygments/lexers/agile.py +24 -0
  705. wandb/vendor/pygments/lexers/algebra.py +221 -0
  706. wandb/vendor/pygments/lexers/ambient.py +76 -0
  707. wandb/vendor/pygments/lexers/ampl.py +87 -0
  708. wandb/vendor/pygments/lexers/apl.py +101 -0
  709. wandb/vendor/pygments/lexers/archetype.py +318 -0
  710. wandb/vendor/pygments/lexers/asm.py +641 -0
  711. wandb/vendor/pygments/lexers/automation.py +374 -0
  712. wandb/vendor/pygments/lexers/basic.py +500 -0
  713. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  714. wandb/vendor/pygments/lexers/business.py +612 -0
  715. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  716. wandb/vendor/pygments/lexers/c_like.py +541 -0
  717. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  718. wandb/vendor/pygments/lexers/chapel.py +102 -0
  719. wandb/vendor/pygments/lexers/clean.py +288 -0
  720. wandb/vendor/pygments/lexers/compiled.py +34 -0
  721. wandb/vendor/pygments/lexers/configs.py +833 -0
  722. wandb/vendor/pygments/lexers/console.py +114 -0
  723. wandb/vendor/pygments/lexers/crystal.py +393 -0
  724. wandb/vendor/pygments/lexers/csound.py +366 -0
  725. wandb/vendor/pygments/lexers/css.py +689 -0
  726. wandb/vendor/pygments/lexers/d.py +251 -0
  727. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  728. wandb/vendor/pygments/lexers/data.py +555 -0
  729. wandb/vendor/pygments/lexers/diff.py +165 -0
  730. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  731. wandb/vendor/pygments/lexers/dsls.py +878 -0
  732. wandb/vendor/pygments/lexers/dylan.py +289 -0
  733. wandb/vendor/pygments/lexers/ecl.py +125 -0
  734. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  735. wandb/vendor/pygments/lexers/elm.py +121 -0
  736. wandb/vendor/pygments/lexers/erlang.py +533 -0
  737. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  738. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  739. wandb/vendor/pygments/lexers/factor.py +344 -0
  740. wandb/vendor/pygments/lexers/fantom.py +250 -0
  741. wandb/vendor/pygments/lexers/felix.py +273 -0
  742. wandb/vendor/pygments/lexers/forth.py +177 -0
  743. wandb/vendor/pygments/lexers/fortran.py +205 -0
  744. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  745. wandb/vendor/pygments/lexers/functional.py +21 -0
  746. wandb/vendor/pygments/lexers/go.py +101 -0
  747. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  748. wandb/vendor/pygments/lexers/graph.py +80 -0
  749. wandb/vendor/pygments/lexers/graphics.py +553 -0
  750. wandb/vendor/pygments/lexers/haskell.py +843 -0
  751. wandb/vendor/pygments/lexers/haxe.py +936 -0
  752. wandb/vendor/pygments/lexers/hdl.py +382 -0
  753. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  754. wandb/vendor/pygments/lexers/html.py +602 -0
  755. wandb/vendor/pygments/lexers/idl.py +270 -0
  756. wandb/vendor/pygments/lexers/igor.py +288 -0
  757. wandb/vendor/pygments/lexers/inferno.py +96 -0
  758. wandb/vendor/pygments/lexers/installers.py +322 -0
  759. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  760. wandb/vendor/pygments/lexers/iolang.py +63 -0
  761. wandb/vendor/pygments/lexers/j.py +146 -0
  762. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  763. wandb/vendor/pygments/lexers/julia.py +333 -0
  764. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  765. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  766. wandb/vendor/pygments/lexers/make.py +202 -0
  767. wandb/vendor/pygments/lexers/markup.py +595 -0
  768. wandb/vendor/pygments/lexers/math.py +21 -0
  769. wandb/vendor/pygments/lexers/matlab.py +663 -0
  770. wandb/vendor/pygments/lexers/ml.py +769 -0
  771. wandb/vendor/pygments/lexers/modeling.py +358 -0
  772. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  773. wandb/vendor/pygments/lexers/monte.py +204 -0
  774. wandb/vendor/pygments/lexers/ncl.py +894 -0
  775. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  776. wandb/vendor/pygments/lexers/nit.py +64 -0
  777. wandb/vendor/pygments/lexers/nix.py +136 -0
  778. wandb/vendor/pygments/lexers/oberon.py +105 -0
  779. wandb/vendor/pygments/lexers/objective.py +504 -0
  780. wandb/vendor/pygments/lexers/ooc.py +85 -0
  781. wandb/vendor/pygments/lexers/other.py +41 -0
  782. wandb/vendor/pygments/lexers/parasail.py +79 -0
  783. wandb/vendor/pygments/lexers/parsers.py +835 -0
  784. wandb/vendor/pygments/lexers/pascal.py +644 -0
  785. wandb/vendor/pygments/lexers/pawn.py +199 -0
  786. wandb/vendor/pygments/lexers/perl.py +620 -0
  787. wandb/vendor/pygments/lexers/php.py +267 -0
  788. wandb/vendor/pygments/lexers/praat.py +294 -0
  789. wandb/vendor/pygments/lexers/prolog.py +306 -0
  790. wandb/vendor/pygments/lexers/python.py +939 -0
  791. wandb/vendor/pygments/lexers/qvt.py +152 -0
  792. wandb/vendor/pygments/lexers/r.py +453 -0
  793. wandb/vendor/pygments/lexers/rdf.py +270 -0
  794. wandb/vendor/pygments/lexers/rebol.py +431 -0
  795. wandb/vendor/pygments/lexers/resource.py +85 -0
  796. wandb/vendor/pygments/lexers/rnc.py +67 -0
  797. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  798. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  799. wandb/vendor/pygments/lexers/ruby.py +519 -0
  800. wandb/vendor/pygments/lexers/rust.py +220 -0
  801. wandb/vendor/pygments/lexers/sas.py +228 -0
  802. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  803. wandb/vendor/pygments/lexers/shell.py +794 -0
  804. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  805. wandb/vendor/pygments/lexers/smv.py +79 -0
  806. wandb/vendor/pygments/lexers/snobol.py +83 -0
  807. wandb/vendor/pygments/lexers/special.py +103 -0
  808. wandb/vendor/pygments/lexers/sql.py +681 -0
  809. wandb/vendor/pygments/lexers/stata.py +108 -0
  810. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  811. wandb/vendor/pygments/lexers/tcl.py +145 -0
  812. wandb/vendor/pygments/lexers/templates.py +2283 -0
  813. wandb/vendor/pygments/lexers/testing.py +207 -0
  814. wandb/vendor/pygments/lexers/text.py +25 -0
  815. wandb/vendor/pygments/lexers/textedit.py +169 -0
  816. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  817. wandb/vendor/pygments/lexers/theorem.py +458 -0
  818. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  819. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  820. wandb/vendor/pygments/lexers/urbi.py +133 -0
  821. wandb/vendor/pygments/lexers/varnish.py +190 -0
  822. wandb/vendor/pygments/lexers/verification.py +111 -0
  823. wandb/vendor/pygments/lexers/web.py +24 -0
  824. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  825. wandb/vendor/pygments/lexers/whiley.py +116 -0
  826. wandb/vendor/pygments/lexers/x10.py +69 -0
  827. wandb/vendor/pygments/modeline.py +44 -0
  828. wandb/vendor/pygments/plugin.py +68 -0
  829. wandb/vendor/pygments/regexopt.py +92 -0
  830. wandb/vendor/pygments/scanner.py +105 -0
  831. wandb/vendor/pygments/sphinxext.py +158 -0
  832. wandb/vendor/pygments/style.py +155 -0
  833. wandb/vendor/pygments/styles/__init__.py +80 -0
  834. wandb/vendor/pygments/styles/abap.py +29 -0
  835. wandb/vendor/pygments/styles/algol.py +63 -0
  836. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  837. wandb/vendor/pygments/styles/arduino.py +98 -0
  838. wandb/vendor/pygments/styles/autumn.py +65 -0
  839. wandb/vendor/pygments/styles/borland.py +51 -0
  840. wandb/vendor/pygments/styles/bw.py +49 -0
  841. wandb/vendor/pygments/styles/colorful.py +81 -0
  842. wandb/vendor/pygments/styles/default.py +73 -0
  843. wandb/vendor/pygments/styles/emacs.py +72 -0
  844. wandb/vendor/pygments/styles/friendly.py +72 -0
  845. wandb/vendor/pygments/styles/fruity.py +42 -0
  846. wandb/vendor/pygments/styles/igor.py +29 -0
  847. wandb/vendor/pygments/styles/lovelace.py +97 -0
  848. wandb/vendor/pygments/styles/manni.py +75 -0
  849. wandb/vendor/pygments/styles/monokai.py +106 -0
  850. wandb/vendor/pygments/styles/murphy.py +80 -0
  851. wandb/vendor/pygments/styles/native.py +65 -0
  852. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  853. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  854. wandb/vendor/pygments/styles/pastie.py +75 -0
  855. wandb/vendor/pygments/styles/perldoc.py +69 -0
  856. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  857. wandb/vendor/pygments/styles/rrt.py +33 -0
  858. wandb/vendor/pygments/styles/sas.py +44 -0
  859. wandb/vendor/pygments/styles/stata.py +40 -0
  860. wandb/vendor/pygments/styles/tango.py +141 -0
  861. wandb/vendor/pygments/styles/trac.py +63 -0
  862. wandb/vendor/pygments/styles/vim.py +63 -0
  863. wandb/vendor/pygments/styles/vs.py +38 -0
  864. wandb/vendor/pygments/styles/xcode.py +51 -0
  865. wandb/vendor/pygments/token.py +213 -0
  866. wandb/vendor/pygments/unistring.py +217 -0
  867. wandb/vendor/pygments/util.py +388 -0
  868. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  869. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  870. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  871. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  872. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  873. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  874. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  875. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  876. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  877. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  878. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  879. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  880. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  881. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  882. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  883. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  884. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  885. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  886. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  887. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  888. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  889. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  890. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  891. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  892. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  893. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  894. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  895. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  896. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  897. wandb/wandb_agent.py +580 -0
  898. wandb/wandb_controller.py +719 -0
  899. wandb/wandb_run.py +8 -0
  900. wandb-0.21.2.dist-info/METADATA +223 -0
  901. wandb-0.21.2.dist-info/RECORD +904 -0
  902. wandb-0.21.2.dist-info/WHEEL +4 -0
  903. wandb-0.21.2.dist-info/entry_points.txt +3 -0
  904. wandb-0.21.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1046 @@
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.apis import public
19
+ from wandb.apis.normalize import normalize_exceptions
20
+ from wandb.apis.paginator import Paginator, SizedPaginator
21
+ from wandb.errors.term import termlog
22
+ from wandb.proto.wandb_deprecated import Deprecated
23
+ from wandb.proto.wandb_internal_pb2 import ServerFeature
24
+ from wandb.sdk.artifacts._generated import (
25
+ ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL,
26
+ ARTIFACT_VERSION_FILES_GQL,
27
+ CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
28
+ DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL,
29
+ DELETE_ARTIFACT_PORTFOLIO_GQL,
30
+ DELETE_ARTIFACT_SEQUENCE_GQL,
31
+ MOVE_ARTIFACT_COLLECTION_GQL,
32
+ PROJECT_ARTIFACT_COLLECTION_GQL,
33
+ PROJECT_ARTIFACT_COLLECTIONS_GQL,
34
+ PROJECT_ARTIFACT_TYPE_GQL,
35
+ PROJECT_ARTIFACT_TYPES_GQL,
36
+ PROJECT_ARTIFACTS_GQL,
37
+ RUN_INPUT_ARTIFACTS_GQL,
38
+ RUN_OUTPUT_ARTIFACTS_GQL,
39
+ UPDATE_ARTIFACT_PORTFOLIO_GQL,
40
+ UPDATE_ARTIFACT_SEQUENCE_GQL,
41
+ ArtifactCollectionMembershipFiles,
42
+ ArtifactCollectionsFragment,
43
+ ArtifactsFragment,
44
+ ArtifactTypeFragment,
45
+ ArtifactTypesFragment,
46
+ ArtifactVersionFiles,
47
+ FilesFragment,
48
+ ProjectArtifactCollection,
49
+ ProjectArtifactCollections,
50
+ ProjectArtifacts,
51
+ ProjectArtifactType,
52
+ ProjectArtifactTypes,
53
+ RunInputArtifactsProjectRunInputArtifacts,
54
+ RunOutputArtifactsProjectRunOutputArtifacts,
55
+ )
56
+ from wandb.sdk.artifacts._graphql_fragments import omit_artifact_fields
57
+ from wandb.sdk.artifacts._validators import (
58
+ SOURCE_ARTIFACT_COLLECTION_TYPE,
59
+ validate_artifact_name,
60
+ validate_artifact_type,
61
+ )
62
+ from wandb.sdk.internal.internal_api import Api as InternalApi
63
+ from wandb.sdk.lib import deprecate
64
+
65
+ from .utils import gql_compat
66
+
67
+ if TYPE_CHECKING:
68
+ from wandb.sdk.artifacts.artifact import Artifact
69
+
70
+ from . import RetryingClient, Run
71
+
72
+
73
+ class ArtifactTypes(Paginator["ArtifactType"]):
74
+ """An lazy iterator of `ArtifactType` objects for a specific project.
75
+
76
+ <!-- lazydoc-ignore-init: internal -->
77
+ """
78
+
79
+ QUERY = gql(PROJECT_ARTIFACT_TYPES_GQL)
80
+
81
+ last_response: ArtifactTypesFragment | None
82
+
83
+ def __init__(
84
+ self,
85
+ client: Client,
86
+ entity: str,
87
+ project: str,
88
+ per_page: int = 50,
89
+ ):
90
+ self.entity = entity
91
+ self.project = project
92
+
93
+ variable_values = {
94
+ "entityName": entity,
95
+ "projectName": project,
96
+ }
97
+ super().__init__(client, variable_values, per_page)
98
+
99
+ @override
100
+ def _update_response(self) -> None:
101
+ """Fetch and validate the response data for the current page."""
102
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
103
+ result = ProjectArtifactTypes.model_validate(data)
104
+
105
+ # Extract the inner `*Connection` result for faster/easier access.
106
+ if not ((proj := result.project) and (conn := proj.artifact_types)):
107
+ raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
108
+
109
+ self.last_response = ArtifactTypesFragment.model_validate(conn)
110
+
111
+ @property
112
+ def _length(self) -> None:
113
+ """Returns `None`.
114
+
115
+ <!-- lazydoc-ignore: internal -->
116
+ """
117
+ # TODO
118
+ return None
119
+
120
+ @property
121
+ def more(self) -> bool:
122
+ """Returns whether there are more artifact types to fetch.
123
+
124
+ <!-- lazydoc-ignore: internal -->
125
+ """
126
+ if self.last_response is None:
127
+ return True
128
+ return self.last_response.page_info.has_next_page
129
+
130
+ @property
131
+ def cursor(self) -> str | None:
132
+ """Returns the cursor for the next page of results.
133
+
134
+ <!-- lazydoc-ignore: internal -->
135
+ """
136
+ if self.last_response is None:
137
+ return None
138
+ return self.last_response.edges[-1].cursor
139
+
140
+ def update_variables(self) -> None:
141
+ """Update the cursor variable for pagination.
142
+
143
+ <!-- lazydoc-ignore: internal -->
144
+ """
145
+ self.variables.update({"cursor": self.cursor})
146
+
147
+ def convert_objects(self) -> list[ArtifactType]:
148
+ """Convert the raw response data into a list of ArtifactType objects.
149
+
150
+ <!-- lazydoc-ignore: internal -->
151
+ """
152
+ if self.last_response is None:
153
+ return []
154
+
155
+ return [
156
+ ArtifactType(
157
+ client=self.client,
158
+ entity=self.entity,
159
+ project=self.project,
160
+ type_name=node.name,
161
+ attrs=node.model_dump(exclude_unset=True),
162
+ )
163
+ for edge in self.last_response.edges
164
+ if edge.node and (node := ArtifactTypeFragment.model_validate(edge.node))
165
+ ]
166
+
167
+
168
+ class ArtifactType:
169
+ """An artifact object that satisfies query based on the specified type.
170
+
171
+ Args:
172
+ client: The client instance to use for querying W&B.
173
+ entity: The entity (user or team) that owns the project.
174
+ project: The name of the project to query for artifact types.
175
+ type_name: The name of the artifact type.
176
+ attrs: Optional mapping of attributes to initialize the artifact type. If not provided,
177
+ the object will load its attributes from W&B upon initialization.
178
+
179
+ <!-- lazydoc-ignore-init: internal -->
180
+ """
181
+
182
+ def __init__(
183
+ self,
184
+ client: Client,
185
+ entity: str,
186
+ project: str,
187
+ type_name: str,
188
+ attrs: Mapping[str, Any] | None = None,
189
+ ):
190
+ self.client = client
191
+ self.entity = entity
192
+ self.project = project
193
+ self.type = type_name
194
+ self._attrs = attrs
195
+ if self._attrs is None:
196
+ self.load()
197
+
198
+ def load(self) -> Mapping[str, Any]:
199
+ """Load the artifact type attributes from W&B.
200
+
201
+ <!-- lazydoc-ignore: internal -->
202
+ """
203
+ data: Mapping[str, Any] | None = self.client.execute(
204
+ gql(PROJECT_ARTIFACT_TYPE_GQL),
205
+ variable_values={
206
+ "entityName": self.entity,
207
+ "projectName": self.project,
208
+ "artifactTypeName": self.type,
209
+ },
210
+ )
211
+ result = ProjectArtifactType.model_validate(data)
212
+ if not ((proj := result.project) and (artifact_type := proj.artifact_type)):
213
+ raise ValueError(f"Could not find artifact type {self.type}")
214
+
215
+ self._attrs = artifact_type.model_dump(exclude_unset=True)
216
+ return self._attrs
217
+
218
+ @property
219
+ def id(self) -> str:
220
+ """The unique identifier of the artifact type."""
221
+ return self._attrs["id"]
222
+
223
+ @property
224
+ def name(self) -> str:
225
+ """The name of the artifact type."""
226
+ return self._attrs["name"]
227
+
228
+ @normalize_exceptions
229
+ def collections(self, per_page: int = 50) -> ArtifactCollections:
230
+ """Get all artifact collections associated with this artifact type.
231
+
232
+ Args:
233
+ per_page (int): The number of artifact collections to fetch per page.
234
+ Default is 50.
235
+ """
236
+ return ArtifactCollections(self.client, self.entity, self.project, self.type)
237
+
238
+ def collection(self, name: str) -> ArtifactCollection:
239
+ """Get a specific artifact collection by name.
240
+
241
+ Args:
242
+ name (str): The name of the artifact collection to retrieve.
243
+ """
244
+ return ArtifactCollection(
245
+ self.client, self.entity, self.project, name, self.type
246
+ )
247
+
248
+ def __repr__(self) -> str:
249
+ return f"<ArtifactType {self.type}>"
250
+
251
+
252
+ class ArtifactCollections(SizedPaginator["ArtifactCollection"]):
253
+ """Artifact collections of a specific type in a project.
254
+
255
+ Args:
256
+ client: The client instance to use for querying W&B.
257
+ entity: The entity (user or team) that owns the project.
258
+ project: The name of the project to query for artifact collections.
259
+ type_name: The name of the artifact type for which to fetch collections.
260
+ per_page: The number of artifact collections to fetch per page. Default is 50.
261
+
262
+ <!-- lazydoc-ignore-init: internal -->
263
+ """
264
+
265
+ last_response: ArtifactCollectionsFragment | None
266
+
267
+ def __init__(
268
+ self,
269
+ client: Client,
270
+ entity: str,
271
+ project: str,
272
+ type_name: str,
273
+ per_page: int = 50,
274
+ ):
275
+ self.entity = entity
276
+ self.project = project
277
+ self.type_name = type_name
278
+
279
+ variable_values = {
280
+ "entityName": entity,
281
+ "projectName": project,
282
+ "artifactTypeName": type_name,
283
+ }
284
+
285
+ if server_supports_artifact_collections_gql_edges(client):
286
+ rename_fields = None
287
+ else:
288
+ rename_fields = {"artifactCollections": "artifactSequences"}
289
+
290
+ self.QUERY = gql_compat(
291
+ PROJECT_ARTIFACT_COLLECTIONS_GQL, rename_fields=rename_fields
292
+ )
293
+
294
+ super().__init__(client, variable_values, per_page)
295
+
296
+ @override
297
+ def _update_response(self) -> None:
298
+ """Fetch and validate the response data for the current page."""
299
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
300
+ result = ProjectArtifactCollections.model_validate(data)
301
+
302
+ # Extract the inner `*Connection` result for faster/easier access.
303
+ if not (
304
+ (proj := result.project)
305
+ and (type_ := proj.artifact_type)
306
+ and (conn := type_.artifact_collections)
307
+ ):
308
+ raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
309
+
310
+ self.last_response = ArtifactCollectionsFragment.model_validate(conn)
311
+
312
+ @property
313
+ def _length(self) -> int:
314
+ """Returns the total number of artifact collections.
315
+
316
+ <!-- lazydoc-ignore: internal -->
317
+ """
318
+ if self.last_response is None:
319
+ self._load_page()
320
+ return self.last_response.total_count
321
+
322
+ @property
323
+ def more(self):
324
+ """Returns whether there are more artifacts to fetch.
325
+
326
+ <!-- lazydoc-ignore: internal -->
327
+ """
328
+ if self.last_response is None:
329
+ return True
330
+ return self.last_response.page_info.has_next_page
331
+
332
+ @property
333
+ def cursor(self):
334
+ """Returns the cursor for the next page of results.
335
+
336
+ <!-- lazydoc-ignore: internal -->
337
+ """
338
+ if self.last_response is None:
339
+ return None
340
+ return self.last_response.edges[-1].cursor
341
+
342
+ def update_variables(self) -> None:
343
+ """Update the cursor variable for pagination.
344
+
345
+ <!-- lazydoc-ignore: internal -->
346
+ """
347
+ self.variables.update({"cursor": self.cursor})
348
+
349
+ def convert_objects(self) -> list[ArtifactCollection]:
350
+ """Convert the raw response data into a list of ArtifactCollection objects.
351
+
352
+ <!-- lazydoc-ignore: internal -->
353
+ """
354
+ if self.last_response is None:
355
+ return []
356
+ return [
357
+ ArtifactCollection(
358
+ client=self.client,
359
+ entity=self.entity,
360
+ project=self.project,
361
+ name=node.name,
362
+ type=self.type_name,
363
+ )
364
+ for edge in self.last_response.edges
365
+ if (node := edge.node)
366
+ ]
367
+
368
+
369
+ class ArtifactCollection:
370
+ """An artifact collection that represents a group of related artifacts.
371
+
372
+ Args:
373
+ client: The client instance to use for querying W&B.
374
+ entity: The entity (user or team) that owns the project.
375
+ project: The name of the project to query for artifact collections.
376
+ name: The name of the artifact collection.
377
+ type: The type of the artifact collection (e.g., "dataset", "model").
378
+ organization: Optional organization name if applicable.
379
+ attrs: Optional mapping of attributes to initialize the artifact collection.
380
+ If not provided, the object will load its attributes from W&B upon
381
+ initialization.
382
+
383
+ <!-- lazydoc-ignore-init: internal -->
384
+ """
385
+
386
+ def __init__(
387
+ self,
388
+ client: Client,
389
+ entity: str,
390
+ project: str,
391
+ name: str,
392
+ type: str,
393
+ organization: str | None = None,
394
+ attrs: Mapping[str, Any] | None = None,
395
+ is_sequence: bool | None = None,
396
+ ):
397
+ self.client = client
398
+ self.entity = entity
399
+ self.project = project
400
+ self._name = validate_artifact_name(name)
401
+ self._saved_name = name
402
+ self._type = type
403
+ self._saved_type = type
404
+ self._attrs = attrs
405
+ if is_sequence is not None:
406
+ self._is_sequence = is_sequence
407
+ if (attrs is None) or (is_sequence is None):
408
+ self.load()
409
+ self._aliases = [a["node"]["alias"] for a in self._attrs["aliases"]["edges"]]
410
+ self._description = self._attrs["description"]
411
+ self._created_at = self._attrs["createdAt"]
412
+ self._tags = [a["node"]["name"] for a in self._attrs["tags"]["edges"]]
413
+ self._saved_tags = copy(self._tags)
414
+ self.organization = organization
415
+
416
+ @property
417
+ def id(self) -> str:
418
+ """The unique identifier of the artifact collection."""
419
+ return self._attrs["id"]
420
+
421
+ @normalize_exceptions
422
+ def artifacts(self, per_page: int = 50) -> Artifacts:
423
+ """Get all artifacts in the collection."""
424
+ return Artifacts(
425
+ client=self.client,
426
+ entity=self.entity,
427
+ project=self.project,
428
+ collection_name=self._saved_name,
429
+ type=self._saved_type,
430
+ per_page=per_page,
431
+ )
432
+
433
+ @property
434
+ def aliases(self) -> list[str]:
435
+ """Artifact Collection Aliases."""
436
+ return self._aliases
437
+
438
+ @property
439
+ def created_at(self) -> str:
440
+ """The creation date of the artifact collection."""
441
+ return self._created_at
442
+
443
+ def load(self):
444
+ """Load the artifact collection attributes from W&B.
445
+
446
+ <!-- lazydoc-ignore: internal -->
447
+ """
448
+ if server_supports_artifact_collections_gql_edges(self.client):
449
+ rename_fields = None
450
+ else:
451
+ rename_fields = {"artifactCollection": "artifactSequence"}
452
+
453
+ response = self.client.execute(
454
+ gql_compat(PROJECT_ARTIFACT_COLLECTION_GQL, rename_fields=rename_fields),
455
+ variable_values={
456
+ "entityName": self.entity,
457
+ "projectName": self.project,
458
+ "artifactTypeName": self._saved_type,
459
+ "artifactCollectionName": self._saved_name,
460
+ },
461
+ )
462
+
463
+ result = ProjectArtifactCollection.model_validate(response)
464
+
465
+ if not (
466
+ result.project
467
+ and (proj := result.project)
468
+ and (type_ := proj.artifact_type)
469
+ and (collection := type_.artifact_collection)
470
+ ):
471
+ raise ValueError(f"Could not find artifact type {self._saved_type}")
472
+
473
+ sequence = type_.artifact_sequence
474
+ self._is_sequence = (
475
+ sequence is not None
476
+ ) and sequence.typename__ == SOURCE_ARTIFACT_COLLECTION_TYPE
477
+
478
+ if self._attrs is None:
479
+ self._attrs = collection.model_dump(exclude_unset=True)
480
+ return self._attrs
481
+
482
+ @normalize_exceptions
483
+ def change_type(self, new_type: str) -> None:
484
+ """Deprecated, change type directly with `save` instead."""
485
+ deprecate.deprecate(
486
+ field_name=Deprecated.artifact_collection__change_type,
487
+ warning_message="ArtifactCollection.change_type(type) is deprecated, use ArtifactCollection.save() instead.",
488
+ )
489
+
490
+ if self._saved_type != new_type:
491
+ try:
492
+ validate_artifact_type(self._saved_type, self.name)
493
+ except ValueError as e:
494
+ raise ValueError(
495
+ f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
496
+ ) from e
497
+
498
+ # Check that the new type is not going to conflict with internal types
499
+ validate_artifact_type(new_type, self.name)
500
+
501
+ if not self.is_sequence():
502
+ raise ValueError("Artifact collection needs to be a sequence")
503
+ termlog(
504
+ f"Changing artifact collection type of {self._saved_type} to {new_type}"
505
+ )
506
+ self.client.execute(
507
+ gql(MOVE_ARTIFACT_COLLECTION_GQL),
508
+ variable_values={
509
+ "artifactSequenceID": self.id,
510
+ "destinationArtifactTypeName": new_type,
511
+ },
512
+ )
513
+ self._saved_type = new_type
514
+ self._type = new_type
515
+
516
+ def is_sequence(self) -> bool:
517
+ """Return whether the artifact collection is a sequence."""
518
+ return self._is_sequence
519
+
520
+ @normalize_exceptions
521
+ def delete(self) -> None:
522
+ """Delete the entire artifact collection."""
523
+ self.client.execute(
524
+ gql(
525
+ DELETE_ARTIFACT_SEQUENCE_GQL
526
+ if self.is_sequence()
527
+ else DELETE_ARTIFACT_PORTFOLIO_GQL
528
+ ),
529
+ variable_values={"id": self.id},
530
+ )
531
+
532
+ @property
533
+ def description(self) -> str:
534
+ """A description of the artifact collection."""
535
+ return self._description
536
+
537
+ @description.setter
538
+ def description(self, description: str | None) -> None:
539
+ """Set the description of the artifact collection."""
540
+ self._description = description
541
+
542
+ @property
543
+ def tags(self) -> list[str]:
544
+ """The tags associated with the artifact collection."""
545
+ return self._tags
546
+
547
+ @tags.setter
548
+ def tags(self, tags: list[str]) -> None:
549
+ """Set the tags associated with the artifact collection."""
550
+ if any(not re.match(r"^[-\w]+([ ]+[-\w]+)*$", tag) for tag in tags):
551
+ raise ValueError(
552
+ "Tags must only contain alphanumeric characters or underscores separated by spaces or hyphens"
553
+ )
554
+ self._tags = tags
555
+
556
+ @property
557
+ def name(self) -> str:
558
+ """The name of the artifact collection."""
559
+ return self._name
560
+
561
+ @name.setter
562
+ def name(self, name: str) -> None:
563
+ """Set the name of the artifact collection."""
564
+ self._name = validate_artifact_name(name)
565
+
566
+ @property
567
+ def type(self):
568
+ """Returns the type of the artifact collection."""
569
+ return self._type
570
+
571
+ @type.setter
572
+ def type(self, type: list[str]) -> None:
573
+ """Set the type of the artifact collection."""
574
+ if not self.is_sequence():
575
+ raise ValueError(
576
+ "Type can only be changed if the artifact collection is a sequence."
577
+ )
578
+ self._type = type
579
+
580
+ def _update_collection(self) -> None:
581
+ self.client.execute(
582
+ gql(
583
+ UPDATE_ARTIFACT_SEQUENCE_GQL
584
+ if self.is_sequence()
585
+ else UPDATE_ARTIFACT_PORTFOLIO_GQL
586
+ ),
587
+ variable_values={
588
+ "id": self.id,
589
+ "name": self.name,
590
+ "description": self.description,
591
+ },
592
+ )
593
+ self._saved_name = self._name
594
+
595
+ def _update_collection_type(self) -> None:
596
+ self.client.execute(
597
+ gql(MOVE_ARTIFACT_COLLECTION_GQL),
598
+ variable_values={
599
+ "artifactSequenceID": self.id,
600
+ "destinationArtifactTypeName": self.type,
601
+ },
602
+ )
603
+ self._saved_type = self._type
604
+
605
+ def _add_tags(self, tags_to_add: Iterable[str]) -> None:
606
+ self.client.execute(
607
+ gql(CREATE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
608
+ variable_values={
609
+ "entityName": self.entity,
610
+ "projectName": self.project,
611
+ "artifactCollectionName": self._saved_name,
612
+ "tags": [{"tagName": tag} for tag in tags_to_add],
613
+ },
614
+ )
615
+
616
+ def _delete_tags(self, tags_to_delete: Iterable[str]) -> None:
617
+ self.client.execute(
618
+ gql(DELETE_ARTIFACT_COLLECTION_TAG_ASSIGNMENTS_GQL),
619
+ variable_values={
620
+ "entityName": self.entity,
621
+ "projectName": self.project,
622
+ "artifactCollectionName": self._saved_name,
623
+ "tags": [{"tagName": tag} for tag in tags_to_delete],
624
+ },
625
+ )
626
+
627
+ @normalize_exceptions
628
+ def save(self) -> None:
629
+ """Persist any changes made to the artifact collection."""
630
+ if self._saved_type != self.type:
631
+ try:
632
+ validate_artifact_type(self.type, self._name)
633
+ except ValueError as e:
634
+ raise ValueError(f"Failed to save artifact collection: {e}") from e
635
+ try:
636
+ validate_artifact_type(self._saved_type, self._name)
637
+ except ValueError as e:
638
+ raise ValueError(
639
+ f"Failed to save artifact collection '{self._name}': "
640
+ f"The current type '{self._saved_type!r}' is an internal type and cannot be changed."
641
+ ) from e
642
+
643
+ self._update_collection()
644
+
645
+ if self.is_sequence() and (self._saved_type != self._type):
646
+ self._update_collection_type()
647
+
648
+ current_tags = set(self._tags)
649
+ saved_tags = set(self._saved_tags)
650
+ if tags_to_add := (current_tags - saved_tags):
651
+ self._add_tags(tags_to_add)
652
+ if tags_to_delete := (saved_tags - current_tags):
653
+ self._delete_tags(tags_to_delete)
654
+ self._saved_tags = copy(self._tags)
655
+
656
+ def __repr__(self) -> str:
657
+ return f"<ArtifactCollection {self._name} ({self._type})>"
658
+
659
+
660
+ class Artifacts(SizedPaginator["Artifact"]):
661
+ """An iterable collection of artifact versions associated with a project.
662
+
663
+ Optionally pass in filters to narrow down the results based on specific criteria.
664
+
665
+ Args:
666
+ client: The client instance to use for querying W&B.
667
+ entity: The entity (user or team) that owns the project.
668
+ project: The name of the project to query for artifacts.
669
+ collection_name: The name of the artifact collection to query.
670
+ type: The type of the artifacts to query. Common examples include
671
+ "dataset" or "model".
672
+ filters: Optional mapping of filters to apply to the query.
673
+ order: Optional string to specify the order of the results.
674
+ per_page: The number of artifact versions to fetch per page. Default is 50.
675
+ tags: Optional string or list of strings to filter artifacts by tags.
676
+
677
+ <!-- lazydoc-ignore-init: internal -->
678
+ """
679
+
680
+ last_response: ArtifactsFragment | None
681
+
682
+ def __init__(
683
+ self,
684
+ client: Client,
685
+ entity: str,
686
+ project: str,
687
+ collection_name: str,
688
+ type: str,
689
+ filters: Mapping[str, Any] | None = None,
690
+ order: str | None = None,
691
+ per_page: int = 50,
692
+ tags: str | list[str] | None = None,
693
+ ):
694
+ self.entity = entity
695
+ self.collection_name = collection_name
696
+ self.type = type
697
+ self.project = project
698
+ self.filters = {"state": "COMMITTED"} if filters is None else filters
699
+ self.tags = [tags] if isinstance(tags, str) else tags
700
+ self.order = order
701
+ variables = {
702
+ "project": self.project,
703
+ "entity": self.entity,
704
+ "order": self.order,
705
+ "type": self.type,
706
+ "collection": self.collection_name,
707
+ "filters": json.dumps(self.filters),
708
+ }
709
+
710
+ if server_supports_artifact_collections_gql_edges(client):
711
+ rename_fields = None
712
+ else:
713
+ rename_fields = {"artifactCollection": "artifactSequence"}
714
+
715
+ self.QUERY = gql_compat(
716
+ PROJECT_ARTIFACTS_GQL,
717
+ omit_fields=omit_artifact_fields(),
718
+ rename_fields=rename_fields,
719
+ )
720
+
721
+ super().__init__(client, variables, per_page)
722
+
723
+ @override
724
+ def _update_response(self) -> None:
725
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
726
+ result = ProjectArtifacts.model_validate(data)
727
+
728
+ # Extract the inner `*Connection` result for faster/easier access.
729
+ if not (
730
+ (proj := result.project)
731
+ and (type_ := proj.artifact_type)
732
+ and (collection := type_.artifact_collection)
733
+ and (conn := collection.artifacts)
734
+ ):
735
+ raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
736
+
737
+ self.last_response = ArtifactsFragment.model_validate(conn)
738
+
739
+ @property
740
+ def _length(self) -> int:
741
+ """Returns the total number of artifacts in the collection.
742
+
743
+ <!-- lazydoc-ignore: internal -->
744
+ """
745
+ if self.last_response is None:
746
+ self._load_page()
747
+ return self.last_response.total_count
748
+
749
+ @property
750
+ def more(self) -> bool:
751
+ """Returns whether there are more files to fetch.
752
+
753
+ <!-- lazydoc-ignore: internal -->
754
+ """
755
+ if self.last_response is None:
756
+ return True
757
+ return self.last_response.page_info.has_next_page
758
+
759
+ @property
760
+ def cursor(self) -> str | None:
761
+ """Returns the cursor for the next page of results.
762
+
763
+ <!-- lazydoc-ignore: internal -->
764
+ """
765
+ if self.last_response is None:
766
+ return None
767
+ return self.last_response.edges[-1].cursor
768
+
769
+ def convert_objects(self) -> list[Artifact]:
770
+ """Convert the raw response data into a list of wandb.Artifact objects.
771
+
772
+ <!-- lazydoc-ignore: internal -->
773
+ """
774
+ if self.last_response is None:
775
+ return []
776
+
777
+ artifact_edges = (edge for edge in self.last_response.edges if edge.node)
778
+ artifacts = (
779
+ wandb.Artifact._from_attrs(
780
+ entity=self.entity,
781
+ project=self.project,
782
+ name=f"{self.collection_name}:{edge.version}",
783
+ attrs=edge.node.model_dump(exclude_unset=True),
784
+ client=self.client,
785
+ )
786
+ for edge in artifact_edges
787
+ )
788
+ required_tags = set(self.tags or [])
789
+ return [art for art in artifacts if required_tags.issubset(art.tags)]
790
+
791
+
792
+ class RunArtifacts(SizedPaginator["Artifact"]):
793
+ """An iterable collection of artifacts associated with a specific run.
794
+
795
+ <!-- lazydoc-ignore-init: internal -->
796
+ """
797
+
798
+ last_response: (
799
+ RunOutputArtifactsProjectRunOutputArtifacts
800
+ | RunInputArtifactsProjectRunInputArtifacts
801
+ )
802
+
803
+ #: The pydantic model used to parse the (inner part of the) raw response.
804
+ _response_cls: type[
805
+ RunOutputArtifactsProjectRunOutputArtifacts
806
+ | RunInputArtifactsProjectRunInputArtifacts
807
+ ]
808
+
809
+ def __init__(
810
+ self,
811
+ client: Client,
812
+ run: Run,
813
+ mode: Literal["logged", "used"] = "logged",
814
+ per_page: int = 50,
815
+ ):
816
+ self.run = run
817
+
818
+ if mode == "logged":
819
+ self.run_key = "outputArtifacts"
820
+ self.QUERY = gql_compat(
821
+ RUN_OUTPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields()
822
+ )
823
+ self._response_cls = RunOutputArtifactsProjectRunOutputArtifacts
824
+ elif mode == "used":
825
+ self.run_key = "inputArtifacts"
826
+ self.QUERY = gql_compat(
827
+ RUN_INPUT_ARTIFACTS_GQL, omit_fields=omit_artifact_fields()
828
+ )
829
+ self._response_cls = RunInputArtifactsProjectRunInputArtifacts
830
+ else:
831
+ raise ValueError("mode must be logged or used")
832
+
833
+ variable_values = {
834
+ "entity": run.entity,
835
+ "project": run.project,
836
+ "runName": run.id,
837
+ }
838
+ super().__init__(client, variable_values, per_page)
839
+
840
+ @override
841
+ def _update_response(self) -> None:
842
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
843
+
844
+ # Extract the inner `*Connection` result for faster/easier access.
845
+ inner_data = data["project"]["run"][self.run_key]
846
+ self.last_response = self._response_cls.model_validate(inner_data)
847
+
848
+ @property
849
+ def _length(self) -> int:
850
+ """Returns the total number of artifacts in the collection.
851
+
852
+ <!-- lazydoc-ignore: internal -->
853
+ """
854
+ if self.last_response is None:
855
+ self._load_page()
856
+ return self.last_response.total_count
857
+
858
+ @property
859
+ def more(self) -> bool:
860
+ """Returns whether there are more artifacts to fetch.
861
+
862
+ <!-- lazydoc-ignore: internal -->
863
+ """
864
+ if self.last_response is None:
865
+ return True
866
+ return self.last_response.page_info.has_next_page
867
+
868
+ @property
869
+ def cursor(self) -> str | None:
870
+ """Returns the cursor for the next page of results.
871
+
872
+ <!-- lazydoc-ignore: internal -->
873
+ """
874
+ if self.last_response is None:
875
+ return None
876
+ return self.last_response.edges[-1].cursor
877
+
878
+ def convert_objects(self) -> list[Artifact]:
879
+ """Convert the raw response data into a list of wandb.Artifact objects.
880
+
881
+ <!-- lazydoc-ignore: internal -->
882
+ """
883
+ if self.last_response is None:
884
+ return []
885
+
886
+ return [
887
+ wandb.Artifact._from_attrs(
888
+ entity=proj.entity_name,
889
+ project=proj.name,
890
+ name=f"{artifact_seq.name}:v{node.version_index}",
891
+ attrs=node.model_dump(exclude_unset=True),
892
+ client=self.client,
893
+ )
894
+ for edge in self.last_response.edges
895
+ if (node := edge.node)
896
+ and (artifact_seq := node.artifact_sequence)
897
+ and (proj := artifact_seq.project)
898
+ ]
899
+
900
+
901
+ class ArtifactFiles(SizedPaginator["public.File"]):
902
+ """A paginator for files in an artifact.
903
+
904
+ <!-- lazydoc-ignore-init: internal -->
905
+ """
906
+
907
+ last_response: FilesFragment | None
908
+
909
+ def __init__(
910
+ self,
911
+ client: Client,
912
+ artifact: Artifact,
913
+ names: Sequence[str] | None = None,
914
+ per_page: int = 50,
915
+ ):
916
+ self.query_via_membership = InternalApi()._server_supports(
917
+ ServerFeature.ARTIFACT_COLLECTION_MEMBERSHIP_FILES
918
+ )
919
+ self.artifact = artifact
920
+
921
+ if self.query_via_membership:
922
+ query_str = ARTIFACT_COLLECTION_MEMBERSHIP_FILES_GQL
923
+ variables = {
924
+ "entityName": artifact.entity,
925
+ "projectName": artifact.project,
926
+ "artifactName": artifact.name.split(":")[0],
927
+ "artifactVersionIndex": artifact.version,
928
+ "fileNames": names,
929
+ }
930
+ else:
931
+ query_str = ARTIFACT_VERSION_FILES_GQL
932
+ variables = {
933
+ "entityName": artifact.source_entity,
934
+ "projectName": artifact.source_project,
935
+ "artifactName": artifact.source_name,
936
+ "artifactTypeName": artifact.type,
937
+ "fileNames": names,
938
+ }
939
+
940
+ # The server must advertise at least SDK 0.12.21
941
+ # to get storagePath
942
+ if not client.version_supported("0.12.21"):
943
+ self.QUERY = gql_compat(query_str, omit_fields={"storagePath"})
944
+ else:
945
+ self.QUERY = gql(query_str)
946
+
947
+ super().__init__(client, variables, per_page)
948
+
949
+ @override
950
+ def _update_response(self) -> None:
951
+ data = self.client.execute(self.QUERY, variable_values=self.variables)
952
+
953
+ # Extract the inner `*Connection` result for faster/easier access.
954
+ if self.query_via_membership:
955
+ result = ArtifactCollectionMembershipFiles.model_validate(data)
956
+ conn = result.project.artifact_collection.artifact_membership.files
957
+ else:
958
+ result = ArtifactVersionFiles.model_validate(data)
959
+ conn = result.project.artifact_type.artifact.files
960
+
961
+ if conn is None:
962
+ raise ValueError(f"Unable to parse {type(self).__name__!r} response data")
963
+
964
+ self.last_response = FilesFragment.model_validate(conn)
965
+
966
+ @property
967
+ def path(self) -> list[str]:
968
+ """Returns the path of the artifact."""
969
+ return [self.artifact.entity, self.artifact.project, self.artifact.name]
970
+
971
+ @property
972
+ def _length(self) -> int:
973
+ if self.last_response is None:
974
+ self._load_page()
975
+ """Returns the total number of files in the artifact.
976
+
977
+ <!-- lazydoc-ignore: internal -->
978
+ """
979
+ return self.artifact.file_count
980
+
981
+ @property
982
+ def more(self) -> bool:
983
+ """Returns whether there are more files to fetch.
984
+
985
+ <!-- lazydoc-ignore: internal -->
986
+ """
987
+ if self.last_response is None:
988
+ return True
989
+ return self.last_response.page_info.has_next_page
990
+
991
+ @property
992
+ def cursor(self) -> str | None:
993
+ """Returns the cursor for the next page of results.
994
+
995
+ <!-- lazydoc-ignore: internal -->
996
+ """
997
+ if self.last_response is None:
998
+ return None
999
+ return self.last_response.edges[-1].cursor
1000
+
1001
+ def update_variables(self) -> None:
1002
+ """Update the variables dictionary with the cursor.
1003
+
1004
+ <!-- lazydoc-ignore: internal -->
1005
+ """
1006
+ self.variables.update({"fileLimit": self.per_page, "fileCursor": self.cursor})
1007
+
1008
+ def convert_objects(self) -> list[public.File]:
1009
+ """Convert the raw response data into a list of public.File objects.
1010
+
1011
+ <!-- lazydoc-ignore: internal -->
1012
+ """
1013
+ if self.last_response is None:
1014
+ return []
1015
+
1016
+ return [
1017
+ public.File(
1018
+ client=self.client,
1019
+ attrs=node.model_dump(exclude_unset=True),
1020
+ )
1021
+ for edge in self.last_response.edges
1022
+ if (node := edge.node)
1023
+ ]
1024
+
1025
+ def __repr__(self) -> str:
1026
+ path_str = "/".join(self.path)
1027
+ return f"<ArtifactFiles {path_str} ({len(self)})>"
1028
+
1029
+
1030
+ def server_supports_artifact_collections_gql_edges(
1031
+ client: RetryingClient, warn: bool = False
1032
+ ) -> bool:
1033
+ """Check if W&B server supports GraphQL edges for artifact collections.
1034
+
1035
+ <!-- lazydoc-ignore-function: internal -->
1036
+ """
1037
+ # TODO: Validate this version
1038
+ # Edges were merged into core on Mar 2, 2022: https://github.com/wandb/core/commit/81c90b29eaacfe0a96dc1ebd83c53560ca763e8b
1039
+ # CLI version was bumped to "0.12.11" on Mar 3, 2022: https://github.com/wandb/core/commit/328396fa7c89a2178d510a1be9c0d4451f350d7b
1040
+ supported = client.version_supported("0.12.11") # edges were merged on
1041
+ if not supported and warn:
1042
+ # First local release to include the above is 0.9.50: https://github.com/wandb/local/releases/tag/0.9.50
1043
+ wandb.termwarn(
1044
+ "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."
1045
+ )
1046
+ return supported