wandb 0.22.2__py3-none-win_amd64.whl → 0.22.3__py3-none-win_amd64.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 (147) hide show
  1. wandb/__init__.py +1 -1
  2. wandb/__init__.pyi +2 -2
  3. wandb/_pydantic/__init__.py +8 -1
  4. wandb/_pydantic/base.py +54 -18
  5. wandb/_pydantic/field_types.py +8 -3
  6. wandb/_pydantic/pagination.py +46 -0
  7. wandb/_pydantic/utils.py +2 -2
  8. wandb/apis/public/api.py +24 -19
  9. wandb/apis/public/artifacts.py +259 -270
  10. wandb/apis/public/registries/_utils.py +40 -54
  11. wandb/apis/public/registries/registries_search.py +70 -85
  12. wandb/apis/public/registries/registry.py +173 -156
  13. wandb/apis/public/runs.py +27 -6
  14. wandb/apis/public/utils.py +43 -20
  15. wandb/automations/_generated/create_automation.py +2 -2
  16. wandb/automations/_generated/create_generic_webhook_integration.py +4 -4
  17. wandb/automations/_generated/delete_automation.py +2 -2
  18. wandb/automations/_generated/fragments.py +31 -52
  19. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +3 -3
  20. wandb/automations/_generated/get_automations.py +3 -3
  21. wandb/automations/_generated/get_automations_by_entity.py +3 -3
  22. wandb/automations/_generated/input_types.py +9 -9
  23. wandb/automations/_generated/integrations_by_entity.py +3 -3
  24. wandb/automations/_generated/operations.py +6 -6
  25. wandb/automations/_generated/slack_integrations_by_entity.py +3 -3
  26. wandb/automations/_generated/update_automation.py +2 -2
  27. wandb/automations/_utils.py +3 -3
  28. wandb/automations/actions.py +3 -3
  29. wandb/automations/automations.py +6 -5
  30. wandb/bin/gpu_stats.exe +0 -0
  31. wandb/bin/wandb-core +0 -0
  32. wandb/cli/beta.py +8 -2
  33. wandb/cli/beta_leet.py +2 -1
  34. wandb/cli/beta_sync.py +1 -1
  35. wandb/errors/term.py +8 -8
  36. wandb/jupyter.py +0 -51
  37. wandb/old/settings.py +6 -6
  38. wandb/proto/v3/wandb_internal_pb2.py +351 -352
  39. wandb/proto/v3/wandb_server_pb2.py +38 -37
  40. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  41. wandb/proto/v3/wandb_sync_pb2.py +19 -6
  42. wandb/proto/v4/wandb_internal_pb2.py +351 -352
  43. wandb/proto/v4/wandb_server_pb2.py +38 -37
  44. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  45. wandb/proto/v4/wandb_sync_pb2.py +10 -6
  46. wandb/proto/v5/wandb_internal_pb2.py +351 -352
  47. wandb/proto/v5/wandb_server_pb2.py +38 -37
  48. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  49. wandb/proto/v5/wandb_sync_pb2.py +10 -6
  50. wandb/proto/v6/wandb_internal_pb2.py +351 -352
  51. wandb/proto/v6/wandb_server_pb2.py +38 -37
  52. wandb/proto/v6/wandb_settings_pb2.py +2 -2
  53. wandb/proto/v6/wandb_sync_pb2.py +10 -6
  54. wandb/sdk/artifacts/_generated/__init__.py +96 -40
  55. wandb/sdk/artifacts/_generated/add_aliases.py +3 -3
  56. wandb/sdk/artifacts/_generated/add_artifact_collection_tags.py +26 -0
  57. wandb/sdk/artifacts/_generated/artifact_by_id.py +2 -2
  58. wandb/sdk/artifacts/_generated/artifact_by_name.py +3 -3
  59. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +27 -8
  60. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +27 -8
  61. wandb/sdk/artifacts/_generated/artifact_created_by.py +7 -20
  62. wandb/sdk/artifacts/_generated/artifact_file_urls.py +19 -6
  63. wandb/sdk/artifacts/_generated/artifact_membership_by_name.py +26 -0
  64. wandb/sdk/artifacts/_generated/artifact_type.py +5 -5
  65. wandb/sdk/artifacts/_generated/artifact_used_by.py +8 -17
  66. wandb/sdk/artifacts/_generated/artifact_version_files.py +19 -8
  67. wandb/sdk/artifacts/_generated/delete_aliases.py +3 -3
  68. wandb/sdk/artifacts/_generated/delete_artifact.py +4 -4
  69. wandb/sdk/artifacts/_generated/delete_artifact_collection_tags.py +23 -0
  70. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +4 -4
  71. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +4 -4
  72. wandb/sdk/artifacts/_generated/delete_registry.py +21 -0
  73. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +8 -20
  74. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +13 -35
  75. wandb/sdk/artifacts/_generated/fetch_org_info_from_entity.py +28 -0
  76. wandb/sdk/artifacts/_generated/fetch_registries.py +18 -8
  77. wandb/sdk/{projects → artifacts}/_generated/fetch_registry.py +4 -4
  78. wandb/sdk/artifacts/_generated/fragments.py +183 -333
  79. wandb/sdk/artifacts/_generated/input_types.py +133 -7
  80. wandb/sdk/artifacts/_generated/link_artifact.py +5 -5
  81. wandb/sdk/artifacts/_generated/operations.py +1053 -548
  82. wandb/sdk/artifacts/_generated/project_artifact_collection.py +9 -77
  83. wandb/sdk/artifacts/_generated/project_artifact_collections.py +21 -9
  84. wandb/sdk/artifacts/_generated/project_artifact_type.py +3 -3
  85. wandb/sdk/artifacts/_generated/project_artifact_types.py +19 -6
  86. wandb/sdk/artifacts/_generated/project_artifacts.py +7 -8
  87. wandb/sdk/artifacts/_generated/registry_collections.py +21 -9
  88. wandb/sdk/artifacts/_generated/registry_versions.py +20 -9
  89. wandb/sdk/artifacts/_generated/rename_registry.py +25 -0
  90. wandb/sdk/artifacts/_generated/run_input_artifacts.py +5 -9
  91. wandb/sdk/artifacts/_generated/run_output_artifacts.py +5 -9
  92. wandb/sdk/artifacts/_generated/type_info.py +2 -2
  93. wandb/sdk/artifacts/_generated/unlink_artifact.py +3 -5
  94. wandb/sdk/artifacts/_generated/update_artifact.py +3 -3
  95. wandb/sdk/artifacts/_generated/update_artifact_collection_type.py +28 -0
  96. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +7 -16
  97. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +7 -16
  98. wandb/sdk/artifacts/_generated/upsert_registry.py +25 -0
  99. wandb/sdk/artifacts/_gqlutils.py +170 -6
  100. wandb/sdk/artifacts/_models/__init__.py +9 -0
  101. wandb/sdk/artifacts/_models/artifact_collection.py +109 -0
  102. wandb/sdk/artifacts/_models/manifest.py +26 -0
  103. wandb/sdk/artifacts/_models/pagination.py +26 -0
  104. wandb/sdk/artifacts/_models/registry.py +100 -0
  105. wandb/sdk/artifacts/_validators.py +45 -27
  106. wandb/sdk/artifacts/artifact.py +220 -215
  107. wandb/sdk/artifacts/artifact_file_cache.py +1 -1
  108. wandb/sdk/artifacts/artifact_manifest.py +37 -32
  109. wandb/sdk/artifacts/artifact_manifest_entry.py +80 -125
  110. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +43 -61
  111. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +8 -6
  112. wandb/sdk/data_types/image.py +2 -2
  113. wandb/sdk/interface/interface.py +72 -64
  114. wandb/sdk/interface/interface_queue.py +27 -18
  115. wandb/sdk/interface/interface_shared.py +61 -23
  116. wandb/sdk/interface/interface_sock.py +9 -5
  117. wandb/sdk/internal/_generated/server_features_query.py +4 -4
  118. wandb/sdk/launch/inputs/schema.py +13 -10
  119. wandb/sdk/lib/apikey.py +8 -12
  120. wandb/sdk/lib/asyncio_compat.py +1 -1
  121. wandb/sdk/lib/asyncio_manager.py +5 -5
  122. wandb/sdk/lib/console_capture.py +38 -30
  123. wandb/sdk/lib/progress.py +159 -64
  124. wandb/sdk/lib/retry.py +3 -2
  125. wandb/sdk/lib/service/service_connection.py +2 -2
  126. wandb/sdk/lib/wb_logging.py +2 -1
  127. wandb/sdk/mailbox/mailbox.py +1 -1
  128. wandb/sdk/wandb_init.py +10 -13
  129. wandb/sdk/wandb_run.py +9 -46
  130. wandb/sdk/wandb_settings.py +102 -19
  131. {wandb-0.22.2.dist-info → wandb-0.22.3.dist-info}/METADATA +2 -1
  132. {wandb-0.22.2.dist-info → wandb-0.22.3.dist-info}/RECORD +135 -134
  133. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +0 -26
  134. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +0 -36
  135. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +0 -25
  136. wandb/sdk/artifacts/_generated/move_artifact_collection.py +0 -35
  137. wandb/sdk/projects/_generated/__init__.py +0 -26
  138. wandb/sdk/projects/_generated/delete_project.py +0 -22
  139. wandb/sdk/projects/_generated/enums.py +0 -4
  140. wandb/sdk/projects/_generated/fragments.py +0 -41
  141. wandb/sdk/projects/_generated/input_types.py +0 -13
  142. wandb/sdk/projects/_generated/operations.py +0 -88
  143. wandb/sdk/projects/_generated/rename_project.py +0 -27
  144. wandb/sdk/projects/_generated/upsert_registry_project.py +0 -27
  145. {wandb-0.22.2.dist-info → wandb-0.22.3.dist-info}/WHEEL +0 -0
  146. {wandb-0.22.2.dist-info → wandb-0.22.3.dist-info}/entry_points.txt +0 -0
  147. {wandb-0.22.2.dist-info → wandb-0.22.3.dist-info}/licenses/LICENSE +0 -0
wandb/sdk/wandb_run.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import asyncio
4
3
  import functools
5
4
  import glob
6
5
  import json
@@ -33,7 +32,6 @@ from wandb.errors import CommError, UsageError
33
32
  from wandb.errors.links import url_registry
34
33
  from wandb.integration.torch import wandb_torch
35
34
  from wandb.plot import CustomChart, Visualize
36
- from wandb.proto import wandb_internal_pb2 as pb
37
35
  from wandb.proto.wandb_deprecated import Deprecated
38
36
  from wandb.proto.wandb_internal_pb2 import (
39
37
  MetricRecord,
@@ -44,7 +42,7 @@ from wandb.proto.wandb_internal_pb2 import (
44
42
  from wandb.sdk.artifacts._internal_artifact import InternalArtifact
45
43
  from wandb.sdk.artifacts.artifact import Artifact
46
44
  from wandb.sdk.internal import job_builder
47
- from wandb.sdk.lib import asyncio_compat, wb_logging
45
+ from wandb.sdk.lib import wb_logging
48
46
  from wandb.sdk.lib.import_hooks import (
49
47
  register_post_import_hook,
50
48
  unregister_post_import_hook,
@@ -489,7 +487,7 @@ class Run:
489
487
 
490
488
  You can log data to a run with `wandb.Run.log()`. Anything you log using
491
489
  `wandb.Run.log()` is sent to that run. See
492
- [Create an experiment](https://docs.wandb.ai/guides/track/launch) or
490
+ [Create an experiment](https://docs.wandb.ai/guides/track/create-an-experiment/) or
493
491
  [`wandb.init`](https://docs.wandb.ai/ref/python/init/) API reference page
494
492
  or more information.
495
493
 
@@ -1574,15 +1572,13 @@ class Run:
1574
1572
 
1575
1573
  @_log_to_run
1576
1574
  def _console_callback(self, name: str, data: str) -> None:
1577
- # logger.info("console callback: %s, %s", name, data)
1578
1575
  if self._backend and self._backend.interface:
1579
- self._backend.interface.publish_output(name, data)
1576
+ # nowait=True so that this can be called from an asyncio context.
1577
+ self._backend.interface.publish_output(name, data, nowait=True)
1580
1578
 
1581
1579
  @_log_to_run
1582
1580
  @_raise_if_finished
1583
1581
  def _console_raw_callback(self, name: str, data: str) -> None:
1584
- # logger.info("console callback: %s, %s", name, data)
1585
-
1586
1582
  # NOTE: console output is only allowed on the process which installed the callback
1587
1583
  # this will prevent potential corruption in the socket to the service. Other methods
1588
1584
  # are protected by the _attach run decorator, but this callback was installed on the
@@ -1592,7 +1588,8 @@ class Run:
1592
1588
  return
1593
1589
 
1594
1590
  if self._backend and self._backend.interface:
1595
- self._backend.interface.publish_output_raw(name, data)
1591
+ # nowait=True so that this can be called from an asyncio context.
1592
+ self._backend.interface.publish_output_raw(name, data, nowait=True)
1596
1593
 
1597
1594
  @_log_to_run
1598
1595
  def _tensorboard_callback(
@@ -1861,7 +1858,7 @@ class Run:
1861
1858
  run.log({"accuracy": 0.8}, step=current_step)
1862
1859
  current_step += 1
1863
1860
  run.log({"train-loss": 0.4}, step=current_step)
1864
- run.log({"accuracy": 0.9}, step=current_step)
1861
+ run.log({"accuracy": 0.9}, step=current_step, commit=True)
1865
1862
  ```
1866
1863
 
1867
1864
  Args:
@@ -2682,41 +2679,6 @@ class Run:
2682
2679
  else:
2683
2680
  return artifact
2684
2681
 
2685
- async def _display_finish_stats(
2686
- self,
2687
- progress_printer: progress.ProgressPrinter,
2688
- ) -> None:
2689
- last_result: Result | None = None
2690
-
2691
- async def loop_update_printer() -> None:
2692
- while True:
2693
- if last_result:
2694
- progress_printer.update(
2695
- [last_result.response.poll_exit_response],
2696
- )
2697
- await asyncio.sleep(0.1)
2698
-
2699
- async def loop_poll_exit() -> None:
2700
- nonlocal last_result
2701
- assert self._backend and self._backend.interface
2702
-
2703
- while True:
2704
- handle = await self._backend.interface.deliver_async(
2705
- pb.Record(request=pb.Request(poll_exit=pb.PollExitRequest()))
2706
- )
2707
-
2708
- time_start = time.monotonic()
2709
- last_result = await handle.wait_async(timeout=None)
2710
-
2711
- # Update at most once a second.
2712
- time_elapsed = time.monotonic() - time_start
2713
- if time_elapsed < 1:
2714
- await asyncio.sleep(1 - time_elapsed)
2715
-
2716
- async with asyncio_compat.open_task_group() as task_group:
2717
- task_group.start_soon(loop_update_printer())
2718
- task_group.start_soon(loop_poll_exit())
2719
-
2720
2682
  def _on_finish(self) -> None:
2721
2683
  trigger.call("on_finished")
2722
2684
 
@@ -2741,8 +2703,9 @@ class Run:
2741
2703
  exit_handle,
2742
2704
  timeout=None,
2743
2705
  display_progress=functools.partial(
2744
- self._display_finish_stats,
2706
+ progress.loop_printing_operation_stats,
2745
2707
  progress_printer,
2708
+ self._backend.interface,
2746
2709
  ),
2747
2710
  )
2748
2711
 
@@ -254,7 +254,40 @@ class Settings(BaseModel, validate_assignment=True):
254
254
  """
255
255
 
256
256
  console_multipart: bool = False
257
- """Whether to produce multipart console log files."""
257
+ """Enable multipart console logging.
258
+
259
+ When True, the SDK writes console output to timestamped files
260
+ under the `logs/` directory instead of a single `output.log`.
261
+
262
+ Each part is uploaded as soon as it is closed, giving users live
263
+ access to logs while the run is active. Rollover cadence is
264
+ controlled by `console_chunk_max_bytes` and/or `console_chunk_max_seconds`.
265
+ If both limits are `0`, all logs are uploaded once at run finish.
266
+
267
+ Note: Uploaded chunks are immutable; terminal control sequences
268
+ that modify previous lines (e.g., progress bars using carriage returns)
269
+ only affect the current chunk.
270
+ """
271
+
272
+ console_chunk_max_bytes: int = 0
273
+ """Size-based rollover threshold for multipart console logs, in bytes.
274
+
275
+ Starts a new console log file when the current part reaches this
276
+ size. Has an effect only when `console_multipart` is `True`.
277
+ Can be combined with `console_chunk_max_seconds`; whichever limit is
278
+ hit first triggers the rollover. A value of `0` disables the
279
+ size-based limit.
280
+ """
281
+
282
+ console_chunk_max_seconds: int = 0
283
+ """Time-based rollover threshold for multipart console logs, in seconds.
284
+
285
+ Starts a new console log file after this many seconds have elapsed
286
+ since the current part began. Requires `console_multipart` to be
287
+ `True`. May be used with `console_chunk_max_bytes`; the first limit
288
+ reached closes the part. A value of `0` disables the time-based
289
+ limit.
290
+ """
258
291
 
259
292
  credentials_file: str = Field(
260
293
  default_factory=lambda: str(credentials.DEFAULT_WANDB_CREDENTIALS_FILE)
@@ -1084,6 +1117,30 @@ class Settings(BaseModel, validate_assignment=True):
1084
1117
 
1085
1118
  return "wrap"
1086
1119
 
1120
+ @field_validator("console_chunk_max_bytes", mode="after")
1121
+ @classmethod
1122
+ def validate_console_chunk_max_bytes(cls, value):
1123
+ """Validate the console_chunk_max_bytes value.
1124
+
1125
+ <!-- lazydoc-ignore: internal -->
1126
+ """
1127
+ if value < 0:
1128
+ raise ValueError("console_chunk_max_bytes must be non-negative")
1129
+
1130
+ return value
1131
+
1132
+ @field_validator("console_chunk_max_seconds", mode="after")
1133
+ @classmethod
1134
+ def validate_console_chunk_max_seconds(cls, value):
1135
+ """Validate the console_chunk_max_seconds value.
1136
+
1137
+ <!-- lazydoc-ignore: internal -->
1138
+ """
1139
+ if value < 0:
1140
+ raise ValueError("console_chunk_max_seconds must be non-negative")
1141
+
1142
+ return value
1143
+
1087
1144
  @field_validator("x_executable", mode="before")
1088
1145
  @classmethod
1089
1146
  def validate_x_executable(cls, value):
@@ -1914,24 +1971,7 @@ class Settings(BaseModel, validate_assignment=True):
1914
1971
  program = self.program or self._get_program()
1915
1972
 
1916
1973
  if program is not None:
1917
- try:
1918
- root = (
1919
- GitRepo().root or os.getcwd()
1920
- if not self.disable_git
1921
- else os.getcwd()
1922
- )
1923
- except Exception:
1924
- # if the git command fails, fall back to the current working directory
1925
- root = os.getcwd()
1926
-
1927
- self.program_relpath = self.program_relpath or self._get_program_relpath(
1928
- program, root
1929
- )
1930
- program_abspath = os.path.abspath(
1931
- os.path.join(root, os.path.relpath(os.getcwd(), root), program)
1932
- )
1933
- if os.path.exists(program_abspath):
1934
- self.program_abspath = program_abspath
1974
+ self._setup_code_paths(program)
1935
1975
  else:
1936
1976
  program = "<python with no main file>"
1937
1977
 
@@ -2196,3 +2236,46 @@ class Settings(BaseModel, validate_assignment=True):
2196
2236
  This is a compatibility property for Pydantic v1 to mimic v2's model_fields_set.
2197
2237
  """
2198
2238
  return getattr(self, "__fields_set__", set())
2239
+
2240
+ def _setup_code_paths(self, program: str):
2241
+ """Sets the program_abspath and program_relpath settings."""
2242
+ if self._jupyter and self.x_jupyter_root:
2243
+ self._infer_code_paths_for_jupyter(program)
2244
+ else:
2245
+ self._infer_code_path_for_program(program)
2246
+
2247
+ def _infer_code_path_for_program(self, program: str):
2248
+ """Finds the program's absolute and relative paths."""
2249
+ try:
2250
+ root = (
2251
+ GitRepo().root or os.getcwd() if not self.disable_git else os.getcwd()
2252
+ )
2253
+ except Exception:
2254
+ # if the git command fails, fall back to the current working directory
2255
+ root = os.getcwd()
2256
+
2257
+ self.program_relpath = self.program_relpath or self._get_program_relpath(
2258
+ program, root
2259
+ )
2260
+
2261
+ program_abspath = os.path.abspath(
2262
+ os.path.join(root, os.path.relpath(os.getcwd(), root), program)
2263
+ )
2264
+
2265
+ if os.path.exists(program_abspath):
2266
+ self.program_abspath = program_abspath
2267
+
2268
+ def _infer_code_paths_for_jupyter(self, program: str):
2269
+ """Find the notebook's absolute and relative paths.
2270
+
2271
+ Since the notebook's execution environment
2272
+ is not the same as the current working directory.
2273
+ We utilize the metadata provided by the jupyter server.
2274
+ """
2275
+ if not self.x_jupyter_root or not program:
2276
+ return None
2277
+
2278
+ self.program_abspath = os.path.abspath(
2279
+ os.path.join(self.x_jupyter_root, program)
2280
+ )
2281
+ self.program_relpath = program
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: wandb
3
- Version: 0.22.2
3
+ Version: 0.22.3
4
4
  Summary: A CLI and library for interacting with the Weights & Biases API.
5
5
  Project-URL: Source, https://github.com/wandb/wandb
6
6
  Project-URL: Bug Reports, https://github.com/wandb/wandb/issues
@@ -42,6 +42,7 @@ Classifier: Programming Language :: Python :: 3.10
42
42
  Classifier: Programming Language :: Python :: 3.11
43
43
  Classifier: Programming Language :: Python :: 3.12
44
44
  Classifier: Programming Language :: Python :: 3.13
45
+ Classifier: Programming Language :: Python :: 3.14
45
46
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
46
47
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
47
48
  Classifier: Topic :: System :: Logging