wandb 0.19.9__py3-none-win32.whl → 0.19.11__py3-none-win32.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 (156) hide show
  1. wandb/__init__.py +1 -1
  2. wandb/__init__.pyi +6 -3
  3. wandb/_pydantic/__init__.py +14 -8
  4. wandb/_pydantic/base.py +51 -36
  5. wandb/_pydantic/utils.py +73 -0
  6. wandb/_pydantic/v1_compat.py +79 -57
  7. wandb/apis/public/__init__.py +2 -2
  8. wandb/apis/public/api.py +684 -4
  9. wandb/apis/public/artifacts.py +377 -677
  10. wandb/apis/public/automations.py +69 -0
  11. wandb/apis/public/integrations.py +180 -0
  12. wandb/apis/public/projects.py +29 -0
  13. wandb/apis/public/registries/__init__.py +0 -0
  14. wandb/apis/public/registries/_freezable_list.py +179 -0
  15. wandb/apis/public/{registries.py → registries/registries_search.py} +22 -129
  16. wandb/apis/public/registries/registry.py +357 -0
  17. wandb/apis/public/registries/utils.py +140 -0
  18. wandb/apis/public/runs.py +58 -56
  19. wandb/apis/public/utils.py +107 -1
  20. wandb/automations/__init__.py +73 -0
  21. wandb/automations/_filters/__init__.py +40 -0
  22. wandb/automations/_filters/expressions.py +181 -0
  23. wandb/automations/_filters/operators.py +258 -0
  24. wandb/automations/_filters/run_metrics.py +332 -0
  25. wandb/automations/_generated/__init__.py +177 -0
  26. wandb/automations/_generated/create_automation.py +17 -0
  27. wandb/automations/_generated/create_generic_webhook_integration.py +43 -0
  28. wandb/automations/_generated/delete_automation.py +17 -0
  29. wandb/automations/_generated/enums.py +33 -0
  30. wandb/automations/_generated/fragments.py +358 -0
  31. wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
  32. wandb/automations/_generated/get_automations.py +24 -0
  33. wandb/automations/_generated/get_automations_by_entity.py +26 -0
  34. wandb/automations/_generated/input_types.py +104 -0
  35. wandb/automations/_generated/integrations_by_entity.py +22 -0
  36. wandb/automations/_generated/operations.py +647 -0
  37. wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
  38. wandb/automations/_generated/update_automation.py +17 -0
  39. wandb/automations/_utils.py +237 -0
  40. wandb/automations/_validators.py +165 -0
  41. wandb/automations/actions.py +220 -0
  42. wandb/automations/automations.py +87 -0
  43. wandb/automations/events.py +287 -0
  44. wandb/automations/integrations.py +45 -0
  45. wandb/automations/scopes.py +78 -0
  46. wandb/beta/workflows.py +9 -10
  47. wandb/bin/gpu_stats.exe +0 -0
  48. wandb/bin/wandb-core +0 -0
  49. wandb/cli/cli.py +3 -3
  50. wandb/env.py +11 -0
  51. wandb/integration/keras/keras.py +2 -1
  52. wandb/integration/langchain/wandb_tracer.py +2 -1
  53. wandb/jupyter.py +137 -118
  54. wandb/old/settings.py +4 -1
  55. wandb/old/summary.py +0 -2
  56. wandb/proto/v3/wandb_internal_pb2.py +297 -292
  57. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  58. wandb/proto/v3/wandb_telemetry_pb2.py +10 -10
  59. wandb/proto/v4/wandb_internal_pb2.py +292 -292
  60. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  61. wandb/proto/v4/wandb_telemetry_pb2.py +10 -10
  62. wandb/proto/v5/wandb_internal_pb2.py +292 -292
  63. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  64. wandb/proto/v5/wandb_telemetry_pb2.py +10 -10
  65. wandb/proto/v6/wandb_base_pb2.py +41 -0
  66. wandb/proto/v6/wandb_internal_pb2.py +393 -0
  67. wandb/proto/v6/wandb_server_pb2.py +78 -0
  68. wandb/proto/v6/wandb_settings_pb2.py +58 -0
  69. wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
  70. wandb/proto/wandb_base_pb2.py +2 -0
  71. wandb/proto/wandb_deprecated.py +8 -0
  72. wandb/proto/wandb_internal_pb2.py +3 -1
  73. wandb/proto/wandb_server_pb2.py +2 -0
  74. wandb/proto/wandb_settings_pb2.py +2 -0
  75. wandb/proto/wandb_telemetry_pb2.py +2 -0
  76. wandb/sdk/artifacts/_generated/__init__.py +289 -0
  77. wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
  78. wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
  79. wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
  80. wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
  81. wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
  82. wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
  83. wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
  84. wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
  85. wandb/sdk/artifacts/_generated/enums.py +17 -0
  86. wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
  87. wandb/sdk/artifacts/_generated/fragments.py +221 -0
  88. wandb/sdk/artifacts/_generated/input_types.py +28 -0
  89. wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
  90. wandb/sdk/artifacts/_generated/operations.py +611 -0
  91. wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
  92. wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
  93. wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
  94. wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
  95. wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
  96. wandb/sdk/artifacts/_generated/run_input_artifacts.py +51 -0
  97. wandb/sdk/artifacts/_generated/run_output_artifacts.py +51 -0
  98. wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
  99. wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
  100. wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
  101. wandb/sdk/artifacts/_graphql_fragments.py +57 -79
  102. wandb/sdk/artifacts/_validators.py +120 -1
  103. wandb/sdk/artifacts/artifact.py +419 -215
  104. wandb/sdk/artifacts/artifact_file_cache.py +4 -6
  105. wandb/sdk/artifacts/artifact_manifest_entry.py +13 -3
  106. wandb/sdk/artifacts/storage_handlers/azure_handler.py +1 -0
  107. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +182 -1
  108. wandb/sdk/artifacts/storage_policy.py +3 -0
  109. wandb/sdk/data_types/base_types/media.py +2 -3
  110. wandb/sdk/data_types/base_types/wb_value.py +34 -11
  111. wandb/sdk/data_types/html.py +36 -9
  112. wandb/sdk/data_types/image.py +12 -12
  113. wandb/sdk/data_types/table.py +5 -0
  114. wandb/sdk/data_types/trace_tree.py +2 -0
  115. wandb/sdk/data_types/utils.py +1 -1
  116. wandb/sdk/data_types/video.py +59 -57
  117. wandb/sdk/interface/interface.py +4 -3
  118. wandb/sdk/internal/internal_api.py +21 -31
  119. wandb/sdk/internal/profiler.py +6 -5
  120. wandb/sdk/internal/run.py +13 -6
  121. wandb/sdk/internal/sender.py +5 -2
  122. wandb/sdk/launch/sweeps/utils.py +8 -0
  123. wandb/sdk/lib/apikey.py +25 -4
  124. wandb/sdk/lib/asyncio_compat.py +1 -1
  125. wandb/sdk/lib/deprecate.py +13 -22
  126. wandb/sdk/lib/disabled.py +2 -1
  127. wandb/sdk/lib/printer.py +37 -8
  128. wandb/sdk/lib/printer_asyncio.py +46 -0
  129. wandb/sdk/lib/redirect.py +10 -5
  130. wandb/sdk/projects/_generated/__init__.py +47 -0
  131. wandb/sdk/projects/_generated/delete_project.py +22 -0
  132. wandb/sdk/projects/_generated/enums.py +4 -0
  133. wandb/sdk/projects/_generated/fetch_registry.py +22 -0
  134. wandb/sdk/projects/_generated/fragments.py +41 -0
  135. wandb/sdk/projects/_generated/input_types.py +13 -0
  136. wandb/sdk/projects/_generated/operations.py +88 -0
  137. wandb/sdk/projects/_generated/rename_project.py +27 -0
  138. wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
  139. wandb/sdk/service/server_sock.py +19 -14
  140. wandb/sdk/service/service.py +18 -8
  141. wandb/sdk/service/streams.py +5 -0
  142. wandb/sdk/verify/verify.py +6 -3
  143. wandb/sdk/wandb_init.py +217 -70
  144. wandb/sdk/wandb_login.py +13 -4
  145. wandb/sdk/wandb_run.py +419 -295
  146. wandb/sdk/wandb_settings.py +27 -10
  147. wandb/sdk/wandb_setup.py +61 -0
  148. wandb/util.py +33 -29
  149. {wandb-0.19.9.dist-info → wandb-0.19.11.dist-info}/METADATA +5 -5
  150. {wandb-0.19.9.dist-info → wandb-0.19.11.dist-info}/RECORD +153 -83
  151. wandb/_globals.py +0 -19
  152. wandb/sdk/internal/_generated/base.py +0 -226
  153. wandb/sdk/internal/_generated/typing_compat.py +0 -14
  154. {wandb-0.19.9.dist-info → wandb-0.19.11.dist-info}/WHEEL +0 -0
  155. {wandb-0.19.9.dist-info → wandb-0.19.11.dist-info}/entry_points.txt +0 -0
  156. {wandb-0.19.9.dist-info → wandb-0.19.11.dist-info}/licenses/LICENSE +0 -0
@@ -246,7 +246,7 @@ class Settings(BaseModel, validate_assignment=True):
246
246
 
247
247
  "wrap_emu" - Same as "wrap" but captures output through an emulator.
248
248
  Derived from the `wrap` setting and should not be set manually.
249
- """
249
+ """
250
250
 
251
251
  console_multipart: bool = False
252
252
  """Whether to produce multipart console log files."""
@@ -376,6 +376,7 @@ class Settings(BaseModel, validate_assignment=True):
376
376
  "default",
377
377
  "return_previous",
378
378
  "finish_previous",
379
+ "create_new",
379
380
  ],
380
381
  bool,
381
382
  ] = "default"
@@ -384,8 +385,14 @@ class Settings(BaseModel, validate_assignment=True):
384
385
  Options:
385
386
  - "default": Use "finish_previous" in notebooks and "return_previous"
386
387
  otherwise.
387
- - "return_previous": Return the active run.
388
- - "finish_previous": Finish the active run, then return a new one.
388
+ - "return_previous": Return the most recently created run
389
+ that is not yet finished. This does not update `wandb.run`; see
390
+ the "create_new" option.
391
+ - "finish_previous": Finish all active runs, then return a new run.
392
+ - "create_new": Create a new run without modifying other active runs.
393
+ Does not update `wandb.run` and top-level functions like `wandb.log`.
394
+ Because of this, some older integrations that rely on the global run
395
+ will not work.
389
396
 
390
397
  Can also be a boolean, but this is deprecated. False is the same as
391
398
  "return_previous", and True is the same as "finish_previous".
@@ -458,11 +465,7 @@ class Settings(BaseModel, validate_assignment=True):
458
465
  save_code: Optional[bool] = None
459
466
  """Whether to save the code associated with the run."""
460
467
 
461
- settings_system: str = Field(
462
- default_factory=lambda: _path_convert(
463
- os.path.join("~", ".config", "wandb", "settings")
464
- )
465
- )
468
+ settings_system: Optional[str] = None
466
469
  """Path to the system-wide settings file."""
467
470
 
468
471
  show_colors: Optional[bool] = None
@@ -689,6 +692,12 @@ class Settings(BaseModel, validate_assignment=True):
689
692
  This does not disable user-provided summary updates.
690
693
  """
691
694
 
695
+ x_server_side_expand_glob_metrics: bool = False
696
+ """Flag to delegate glob matching of metrics in define_metric to the server.
697
+
698
+ If the server does not support this, the client will perform the glob matching.
699
+ """
700
+
692
701
  x_service_transport: Optional[str] = None
693
702
  """Transport method for communication with the wandb service."""
694
703
 
@@ -1052,9 +1061,12 @@ class Settings(BaseModel, validate_assignment=True):
1052
1061
  @field_validator("settings_system", mode="after")
1053
1062
  @classmethod
1054
1063
  def validate_settings_system(cls, value):
1055
- if isinstance(value, pathlib.Path):
1064
+ if value is None:
1065
+ return None
1066
+ elif isinstance(value, pathlib.Path):
1056
1067
  return str(_path_convert(value))
1057
- return _path_convert(value)
1068
+ else:
1069
+ return _path_convert(value)
1058
1070
 
1059
1071
  @field_validator("x_service_wait", mode="after")
1060
1072
  @classmethod
@@ -1662,6 +1674,11 @@ class Settings(BaseModel, validate_assignment=True):
1662
1674
  if not root:
1663
1675
  return None
1664
1676
 
1677
+ # For windows if the root and program are on different drives,
1678
+ # os.path.relpath will raise a ValueError.
1679
+ if not util.are_paths_on_same_drive(root, program):
1680
+ return None
1681
+
1665
1682
  full_path_to_program = os.path.join(
1666
1683
  root, os.path.relpath(os.getcwd(), root), program
1667
1684
  )
wandb/sdk/wandb_setup.py CHANGED
@@ -15,18 +15,21 @@ from __future__ import annotations
15
15
 
16
16
  import logging
17
17
  import os
18
+ import pathlib
18
19
  import sys
19
20
  import threading
20
21
  from typing import TYPE_CHECKING, Any, Union
21
22
 
22
23
  import wandb
23
24
  import wandb.integration.sagemaker as sagemaker
25
+ from wandb.env import CONFIG_DIR
24
26
  from wandb.sdk.lib import import_hooks, wb_logging
25
27
 
26
28
  from . import wandb_settings
27
29
  from .lib import config_util, server
28
30
 
29
31
  if TYPE_CHECKING:
32
+ from wandb.sdk import wandb_run
30
33
  from wandb.sdk.lib.service_connection import ServiceConnection
31
34
  from wandb.sdk.wandb_settings import Settings
32
35
 
@@ -83,6 +86,8 @@ class _WandbSetup:
83
86
  ) -> None:
84
87
  self._connection: ServiceConnection | None = None
85
88
 
89
+ self._active_runs: list[wandb_run.Run] = []
90
+
86
91
  self._environ = environ or dict(os.environ)
87
92
  self._sweep_config: dict | None = None
88
93
  self._config: dict | None = None
@@ -100,6 +105,52 @@ class _WandbSetup:
100
105
  self._check()
101
106
  self._setup()
102
107
 
108
+ def add_active_run(self, run: wandb_run.Run) -> None:
109
+ """Append a run to the active runs list.
110
+
111
+ This must be called when a run is initialized.
112
+
113
+ Args:
114
+ run: A newly initialized run.
115
+ """
116
+ if run not in self._active_runs:
117
+ self._active_runs.append(run)
118
+
119
+ def remove_active_run(self, run: wandb_run.Run) -> None:
120
+ """Remove the run from the active runs list.
121
+
122
+ This must be called when a run is finished.
123
+
124
+ Args:
125
+ run: A run that is finished or crashed.
126
+ """
127
+ try:
128
+ self._active_runs.remove(run)
129
+ except ValueError:
130
+ pass # Removing a run multiple times is not an error.
131
+
132
+ @property
133
+ def most_recent_active_run(self) -> wandb_run.Run | None:
134
+ """The most recently initialized run that is not yet finished."""
135
+ if not self._active_runs:
136
+ return None
137
+
138
+ return self._active_runs[-1]
139
+
140
+ def finish_all_active_runs(self) -> None:
141
+ """Finish all unfinished runs.
142
+
143
+ NOTE: This is slightly inefficient as it finishes runs one at a time.
144
+ This only exists to support using the `reinit="finish_previous"`
145
+ setting together with `reinit="create_new"` which does not seem to be a
146
+ useful pattern. Since `"create_new"` should eventually become the
147
+ default and only behavior, it does not seem worth optimizing.
148
+ """
149
+ # Take a snapshot as each call to `finish()` modifies `_active_runs`.
150
+ runs_copy = list(self._active_runs)
151
+ for run in runs_copy:
152
+ run.finish()
153
+
103
154
  def _settings_setup(
104
155
  self,
105
156
  settings: Settings | None,
@@ -112,6 +163,16 @@ class _WandbSetup:
112
163
  self._logger.info(f"Configure stats pid to {pid}")
113
164
  s.x_stats_pid = pid
114
165
 
166
+ if settings and settings.settings_system:
167
+ s.settings_system = settings.settings_system
168
+ elif config_dir_str := os.getenv(CONFIG_DIR, None):
169
+ config_dir = pathlib.Path(config_dir_str).expanduser()
170
+ s.settings_system = str(config_dir / "settings")
171
+ else:
172
+ s.settings_system = str(
173
+ pathlib.Path("~", ".config", "wandb", "settings").expanduser()
174
+ )
175
+
115
176
  # load settings from the system config
116
177
  if s.settings_system:
117
178
  self._logger.info(f"Loading settings from {s.settings_system}")
wandb/util.py CHANGED
@@ -51,6 +51,11 @@ from typing import (
51
51
  Union,
52
52
  )
53
53
 
54
+ if sys.version_info < (3, 10):
55
+ from typing_extensions import TypeGuard
56
+ else:
57
+ from typing import TypeGuard
58
+
54
59
  import requests
55
60
  import yaml
56
61
 
@@ -184,6 +189,13 @@ class LazyModuleState:
184
189
  self.module.__spec__.loader.exec_module(self.module)
185
190
  self.module.__class__ = types.ModuleType
186
191
 
192
+ # Set the submodule as an attribute on the parent module
193
+ # This enables access to the submodule via normal attribute access.
194
+ parent, _, child = self.module.__name__.rpartition(".")
195
+ if parent:
196
+ parent_module = sys.modules[parent]
197
+ setattr(parent_module, child, self.module)
198
+
187
199
 
188
200
  class LazyModule(types.ModuleType):
189
201
  def __getattribute__(self, name: str) -> Any:
@@ -1060,18 +1072,6 @@ def has_num(dictionary: Mapping, key: Any) -> bool:
1060
1072
  return key in dictionary and isinstance(dictionary[key], numbers.Number)
1061
1073
 
1062
1074
 
1063
- def get_log_file_path() -> str:
1064
- """Log file path used in error messages.
1065
-
1066
- It would probably be better if this pointed to a log file in a
1067
- run directory.
1068
- """
1069
- # TODO(jhr, cvp): refactor
1070
- if wandb.run is not None:
1071
- return wandb.run._settings.log_internal
1072
- return os.path.join("wandb", "debug-internal.log")
1073
-
1074
-
1075
1075
  def docker_image_regex(image: str) -> Any:
1076
1076
  """Regex match for valid docker image names."""
1077
1077
  if image:
@@ -1438,6 +1438,24 @@ def auto_project_name(program: Optional[str]) -> str:
1438
1438
  return str(project.replace(os.sep, "_"))
1439
1439
 
1440
1440
 
1441
+ def are_paths_on_same_drive(path1: str, path2: str) -> bool:
1442
+ """Check if two paths are on the same drive.
1443
+
1444
+ This check is only relevant on Windows,
1445
+ since the concept of drives only exists on Windows.
1446
+ """
1447
+ if platform.system() != "Windows":
1448
+ return True
1449
+
1450
+ try:
1451
+ path1_drive = pathlib.Path(path1).resolve().drive
1452
+ path2_drive = pathlib.Path(path2).resolve().drive
1453
+ return path1_drive == path2_drive
1454
+ # If either path is not a valid windows path, an OSError is raised.
1455
+ except OSError:
1456
+ return False
1457
+
1458
+
1441
1459
  # TODO(hugh): Deprecate version here and use wandb/sdk/lib/paths.py
1442
1460
  def to_forward_slash_path(path: str) -> str:
1443
1461
  if platform.system() == "Windows":
@@ -1698,15 +1716,15 @@ def _resolve_aliases(aliases: Optional[Union[str, Iterable[str]]]) -> List[str]:
1698
1716
  raise ValueError("`aliases` must be Iterable or None") from exc
1699
1717
 
1700
1718
 
1701
- def _is_artifact_object(v: Any) -> bool:
1719
+ def _is_artifact_object(v: Any) -> "TypeGuard[wandb.Artifact]":
1702
1720
  return isinstance(v, wandb.Artifact)
1703
1721
 
1704
1722
 
1705
- def _is_artifact_string(v: Any) -> bool:
1723
+ def _is_artifact_string(v: Any) -> "TypeGuard[str]":
1706
1724
  return isinstance(v, str) and v.startswith("wandb-artifact://")
1707
1725
 
1708
1726
 
1709
- def _is_artifact_version_weave_dict(v: Any) -> bool:
1727
+ def _is_artifact_version_weave_dict(v: Any) -> "TypeGuard[dict]":
1710
1728
  return isinstance(v, dict) and v.get("_type") == "artifactVersion"
1711
1729
 
1712
1730
 
@@ -1750,20 +1768,6 @@ def _get_max_cli_version() -> Union[str, None]:
1750
1768
  return str(max_cli_version) if max_cli_version is not None else None
1751
1769
 
1752
1770
 
1753
- def _is_offline() -> bool:
1754
- """Returns true if wandb is configured to be offline.
1755
-
1756
- If there is an active run, returns whether the run is offline.
1757
- Otherwise, returns the default mode, which is affected by explicit settings
1758
- passed to `wandb.setup()`, environment variables, and W&B configuration
1759
- files.
1760
- """
1761
- if wandb.run:
1762
- return wandb.run.settings._offline
1763
- else:
1764
- return wandb.setup().settings._offline
1765
-
1766
-
1767
1771
  def ensure_text(
1768
1772
  string: Union[str, bytes], encoding: str = "utf-8", errors: str = "strict"
1769
1773
  ) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: wandb
3
- Version: 0.19.9
3
+ Version: 0.19.11
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
@@ -52,10 +52,10 @@ Requires-Dist: docker-pycreds>=0.4.0
52
52
  Requires-Dist: eval-type-backport; python_version < '3.10'
53
53
  Requires-Dist: gitpython!=3.1.29,>=1.0.0
54
54
  Requires-Dist: platformdirs
55
- Requires-Dist: protobuf!=4.21.0,!=5.28.0,<6,>=3.12.0; python_version < '3.9' and sys_platform == 'linux'
56
- Requires-Dist: protobuf!=4.21.0,!=5.28.0,<6,>=3.15.0; python_version == '3.9' and sys_platform == 'linux'
57
- Requires-Dist: protobuf!=4.21.0,!=5.28.0,<6,>=3.19.0; python_version > '3.9' and sys_platform == 'linux'
58
- Requires-Dist: protobuf!=4.21.0,!=5.28.0,<6,>=3.19.0; sys_platform != 'linux'
55
+ Requires-Dist: protobuf!=4.21.0,!=5.28.0,<7,>=3.12.0; python_version < '3.9' and sys_platform == 'linux'
56
+ Requires-Dist: protobuf!=4.21.0,!=5.28.0,<7,>=3.15.0; python_version == '3.9' and sys_platform == 'linux'
57
+ Requires-Dist: protobuf!=4.21.0,!=5.28.0,<7,>=3.19.0; python_version > '3.9' and sys_platform == 'linux'
58
+ Requires-Dist: protobuf!=4.21.0,!=5.28.0,<7,>=3.19.0; sys_platform != 'linux'
59
59
  Requires-Dist: psutil>=5.0.0
60
60
  Requires-Dist: pydantic<3
61
61
  Requires-Dist: pyyaml