wandb 0.22.2__py3-none-win32.whl → 0.22.3__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 (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
@@ -1,15 +1,7 @@
1
- """Interface base class - Used to send messages to the internal process.
2
-
3
- InterfaceBase: The abstract class
4
- InterfaceShared: Common routines for socket and queue based implementations
5
- InterfaceQueue: Use multiprocessing queues to send and receive messages
6
- InterfaceSock: Use socket to send and receive messages
7
- """
8
-
1
+ import abc
9
2
  import gzip
10
3
  import logging
11
4
  import time
12
- from abc import abstractmethod
13
5
  from pathlib import Path
14
6
  from secrets import token_hex
15
7
  from typing import (
@@ -86,11 +78,11 @@ def file_enum_to_policy(enum: "pb.FilesItem.PolicyType.V") -> "PolicyName":
86
78
  return policy
87
79
 
88
80
 
89
- class InterfaceBase:
90
- """Methods for sending different types of Records to the service.
81
+ class InterfaceBase(abc.ABC):
82
+ """Methods for sending run messages (Records) to the service.
91
83
 
92
84
  None of the methods may be called from an asyncio context other than
93
- deliver_async().
85
+ deliver_async() or those with a `nowait=True` argument.
94
86
  """
95
87
 
96
88
  _drop: bool
@@ -98,7 +90,7 @@ class InterfaceBase:
98
90
  def __init__(self) -> None:
99
91
  self._drop = False
100
92
 
101
- @abstractmethod
93
+ @abc.abstractmethod
102
94
  async def deliver_async(
103
95
  self,
104
96
  record: pb.Record,
@@ -117,20 +109,19 @@ class InterfaceBase:
117
109
  Returns:
118
110
  A handle to wait for a response to the record.
119
111
  """
120
- raise NotImplementedError
121
112
 
122
113
  def publish_header(self) -> None:
123
114
  header = pb.HeaderRecord()
124
115
  self._publish_header(header)
125
116
 
126
- @abstractmethod
117
+ @abc.abstractmethod
127
118
  def _publish_header(self, header: pb.HeaderRecord) -> None:
128
119
  raise NotImplementedError
129
120
 
130
121
  def deliver_status(self) -> MailboxHandle[pb.Result]:
131
122
  return self._deliver_status(pb.StatusRequest())
132
123
 
133
- @abstractmethod
124
+ @abc.abstractmethod
134
125
  def _deliver_status(
135
126
  self,
136
127
  status: pb.StatusRequest,
@@ -217,7 +208,7 @@ class InterfaceBase:
217
208
  run_record = self._make_run(run)
218
209
  self._publish_run(run_record)
219
210
 
220
- @abstractmethod
211
+ @abc.abstractmethod
221
212
  def _publish_run(self, run: pb.RunRecord) -> None:
222
213
  raise NotImplementedError
223
214
 
@@ -225,7 +216,7 @@ class InterfaceBase:
225
216
  cancel = pb.CancelRequest(cancel_slot=cancel_slot)
226
217
  self._publish_cancel(cancel)
227
218
 
228
- @abstractmethod
219
+ @abc.abstractmethod
229
220
  def _publish_cancel(self, cancel: pb.CancelRequest) -> None:
230
221
  raise NotImplementedError
231
222
 
@@ -239,11 +230,11 @@ class InterfaceBase:
239
230
 
240
231
  self._publish_config(cfg)
241
232
 
242
- @abstractmethod
233
+ @abc.abstractmethod
243
234
  def _publish_config(self, cfg: pb.ConfigRecord) -> None:
244
235
  raise NotImplementedError
245
236
 
246
- @abstractmethod
237
+ @abc.abstractmethod
247
238
  def _publish_metric(self, metric: pb.MetricRecord) -> None:
248
239
  raise NotImplementedError
249
240
 
@@ -349,7 +340,7 @@ class InterfaceBase:
349
340
  pb_summary_record = self._make_summary(summary_record, run=run)
350
341
  self._publish_summary(pb_summary_record)
351
342
 
352
- @abstractmethod
343
+ @abc.abstractmethod
353
344
  def _publish_summary(self, summary: pb.SummaryRecord) -> None:
354
345
  raise NotImplementedError
355
346
 
@@ -365,7 +356,7 @@ class InterfaceBase:
365
356
  files = self._make_files(files_dict)
366
357
  self._publish_files(files)
367
358
 
368
- @abstractmethod
359
+ @abc.abstractmethod
369
360
  def _publish_files(self, files: pb.FilesRecord) -> None:
370
361
  raise NotImplementedError
371
362
 
@@ -375,7 +366,7 @@ class InterfaceBase:
375
366
  python_packages.package.add(name=pkg.key, version=pkg.version)
376
367
  self._publish_python_packages(python_packages)
377
368
 
378
- @abstractmethod
369
+ @abc.abstractmethod
379
370
  def _publish_python_packages(
380
371
  self, python_packages: pb.PythonPackagesRequest
381
372
  ) -> None:
@@ -481,7 +472,7 @@ class InterfaceBase:
481
472
 
482
473
  return self._deliver_link_artifact(link_artifact)
483
474
 
484
- @abstractmethod
475
+ @abc.abstractmethod
485
476
  def _deliver_link_artifact(
486
477
  self, link_artifact: pb.LinkArtifactRequest
487
478
  ) -> MailboxHandle[pb.Result]:
@@ -588,7 +579,7 @@ class InterfaceBase:
588
579
 
589
580
  self._publish_use_artifact(use_artifact)
590
581
 
591
- @abstractmethod
582
+ @abc.abstractmethod
592
583
  def _publish_use_artifact(self, proto_artifact: pb.UseArtifactRecord) -> None:
593
584
  raise NotImplementedError
594
585
 
@@ -623,7 +614,7 @@ class InterfaceBase:
623
614
  resp = self._deliver_artifact(log_artifact)
624
615
  return resp
625
616
 
626
- @abstractmethod
617
+ @abc.abstractmethod
627
618
  def _deliver_artifact(
628
619
  self,
629
620
  log_artifact: pb.LogArtifactRequest,
@@ -647,7 +638,7 @@ class InterfaceBase:
647
638
  resp = self._deliver_download_artifact(download_artifact)
648
639
  return resp
649
640
 
650
- @abstractmethod
641
+ @abc.abstractmethod
651
642
  def _deliver_download_artifact(
652
643
  self, download_artifact: pb.DownloadArtifactRequest
653
644
  ) -> MailboxHandle[pb.Result]:
@@ -675,7 +666,7 @@ class InterfaceBase:
675
666
  proto_artifact.tags.extend(tags or [])
676
667
  self._publish_artifact(proto_artifact)
677
668
 
678
- @abstractmethod
669
+ @abc.abstractmethod
679
670
  def _publish_artifact(self, proto_artifact: pb.ArtifactRecord) -> None:
680
671
  raise NotImplementedError
681
672
 
@@ -686,18 +677,18 @@ class InterfaceBase:
686
677
  tbrecord.root_dir = root_logdir
687
678
  self._publish_tbdata(tbrecord)
688
679
 
689
- @abstractmethod
680
+ @abc.abstractmethod
690
681
  def _publish_tbdata(self, tbrecord: pb.TBRecord) -> None:
691
682
  raise NotImplementedError
692
683
 
693
- @abstractmethod
684
+ @abc.abstractmethod
694
685
  def _publish_telemetry(self, telem: tpb.TelemetryRecord) -> None:
695
686
  raise NotImplementedError
696
687
 
697
688
  def publish_environment(self, environment: pb.EnvironmentRecord) -> None:
698
689
  self._publish_environment(environment)
699
690
 
700
- @abstractmethod
691
+ @abc.abstractmethod
701
692
  def _publish_environment(self, environment: pb.EnvironmentRecord) -> None:
702
693
  raise NotImplementedError
703
694
 
@@ -730,7 +721,7 @@ class InterfaceBase:
730
721
  partial_history.action.flush = flush
731
722
  self._publish_partial_history(partial_history)
732
723
 
733
- @abstractmethod
724
+ @abc.abstractmethod
734
725
  def _publish_partial_history(self, history: pb.PartialHistoryRequest) -> None:
735
726
  raise NotImplementedError
736
727
 
@@ -753,7 +744,7 @@ class InterfaceBase:
753
744
  item.value_json = json_dumps_safer_history(v)
754
745
  self._publish_history(history)
755
746
 
756
- @abstractmethod
747
+ @abc.abstractmethod
757
748
  def _publish_history(self, history: pb.HistoryRecord) -> None:
758
749
  raise NotImplementedError
759
750
 
@@ -761,11 +752,17 @@ class InterfaceBase:
761
752
  preempt_rec = pb.RunPreemptingRecord()
762
753
  self._publish_preempting(preempt_rec)
763
754
 
764
- @abstractmethod
755
+ @abc.abstractmethod
765
756
  def _publish_preempting(self, preempt_rec: pb.RunPreemptingRecord) -> None:
766
757
  raise NotImplementedError
767
758
 
768
- def publish_output(self, name: str, data: str) -> None:
759
+ def publish_output(
760
+ self,
761
+ name: str,
762
+ data: str,
763
+ *,
764
+ nowait: bool = False,
765
+ ) -> None:
769
766
  # from vendor.protobuf import google3.protobuf.timestamp
770
767
  # ts = timestamp.Timestamp()
771
768
  # ts.GetCurrentTime()
@@ -779,13 +776,19 @@ class InterfaceBase:
779
776
  termwarn("unknown type")
780
777
  o = pb.OutputRecord(output_type=otype, line=data)
781
778
  o.timestamp.GetCurrentTime()
782
- self._publish_output(o)
779
+ self._publish_output(o, nowait=nowait)
783
780
 
784
- @abstractmethod
785
- def _publish_output(self, outdata: pb.OutputRecord) -> None:
781
+ @abc.abstractmethod
782
+ def _publish_output(self, outdata: pb.OutputRecord, *, nowait: bool) -> None:
786
783
  raise NotImplementedError
787
784
 
788
- def publish_output_raw(self, name: str, data: str) -> None:
785
+ def publish_output_raw(
786
+ self,
787
+ name: str,
788
+ data: str,
789
+ *,
790
+ nowait: bool = False,
791
+ ) -> None:
789
792
  # from vendor.protobuf import google3.protobuf.timestamp
790
793
  # ts = timestamp.Timestamp()
791
794
  # ts.GetCurrentTime()
@@ -799,17 +802,22 @@ class InterfaceBase:
799
802
  termwarn("unknown type")
800
803
  o = pb.OutputRawRecord(output_type=otype, line=data)
801
804
  o.timestamp.GetCurrentTime()
802
- self._publish_output_raw(o)
805
+ self._publish_output_raw(o, nowait=nowait)
803
806
 
804
- @abstractmethod
805
- def _publish_output_raw(self, outdata: pb.OutputRawRecord) -> None:
807
+ @abc.abstractmethod
808
+ def _publish_output_raw(
809
+ self,
810
+ outdata: pb.OutputRawRecord,
811
+ *,
812
+ nowait: bool,
813
+ ) -> None:
806
814
  raise NotImplementedError
807
815
 
808
816
  def publish_pause(self) -> None:
809
817
  pause = pb.PauseRequest()
810
818
  self._publish_pause(pause)
811
819
 
812
- @abstractmethod
820
+ @abc.abstractmethod
813
821
  def _publish_pause(self, pause: pb.PauseRequest) -> None:
814
822
  raise NotImplementedError
815
823
 
@@ -817,7 +825,7 @@ class InterfaceBase:
817
825
  resume = pb.ResumeRequest()
818
826
  self._publish_resume(resume)
819
827
 
820
- @abstractmethod
828
+ @abc.abstractmethod
821
829
  def _publish_resume(self, resume: pb.ResumeRequest) -> None:
822
830
  raise NotImplementedError
823
831
 
@@ -831,7 +839,7 @@ class InterfaceBase:
831
839
  proto_alert.wait_duration = wait_duration
832
840
  self._publish_alert(proto_alert)
833
841
 
834
- @abstractmethod
842
+ @abc.abstractmethod
835
843
  def _publish_alert(self, alert: pb.AlertRecord) -> None:
836
844
  raise NotImplementedError
837
845
 
@@ -845,7 +853,7 @@ class InterfaceBase:
845
853
  exit_data = self._make_exit(exit_code)
846
854
  self._publish_exit(exit_data)
847
855
 
848
- @abstractmethod
856
+ @abc.abstractmethod
849
857
  def _publish_exit(self, exit_data: pb.RunExitRecord) -> None:
850
858
  raise NotImplementedError
851
859
 
@@ -853,7 +861,7 @@ class InterfaceBase:
853
861
  keepalive = pb.KeepaliveRequest()
854
862
  self._publish_keepalive(keepalive)
855
863
 
856
- @abstractmethod
864
+ @abc.abstractmethod
857
865
  def _publish_keepalive(self, keepalive: pb.KeepaliveRequest) -> None:
858
866
  raise NotImplementedError
859
867
 
@@ -908,7 +916,7 @@ class InterfaceBase:
908
916
 
909
917
  return self._publish_job_input(request)
910
918
 
911
- @abstractmethod
919
+ @abc.abstractmethod
912
920
  def _publish_job_input(
913
921
  self, request: pb.JobInputRequest
914
922
  ) -> MailboxHandle[pb.Result]:
@@ -918,7 +926,7 @@ class InterfaceBase:
918
926
  probe_system_info = pb.ProbeSystemInfoRequest()
919
927
  return self._publish_probe_system_info(probe_system_info)
920
928
 
921
- @abstractmethod
929
+ @abc.abstractmethod
922
930
  def _publish_probe_system_info(
923
931
  self, probe_system_info: pb.ProbeSystemInfoRequest
924
932
  ) -> None:
@@ -942,7 +950,7 @@ class InterfaceBase:
942
950
  # before a response is read.
943
951
  logger.warning("handle abandoned while communicating shutdown")
944
952
 
945
- @abstractmethod
953
+ @abc.abstractmethod
946
954
  def _deliver_shutdown(self) -> MailboxHandle[pb.Result]:
947
955
  raise NotImplementedError
948
956
 
@@ -956,13 +964,13 @@ class InterfaceBase:
956
964
  sync = pb.SyncFinishRequest()
957
965
  return self._deliver_finish_sync(sync)
958
966
 
959
- @abstractmethod
967
+ @abc.abstractmethod
960
968
  def _deliver_finish_sync(
961
969
  self, sync: pb.SyncFinishRequest
962
970
  ) -> MailboxHandle[pb.Result]:
963
971
  raise NotImplementedError
964
972
 
965
- @abstractmethod
973
+ @abc.abstractmethod
966
974
  def _deliver_run(self, run: pb.RunRecord) -> MailboxHandle[pb.Result]:
967
975
  raise NotImplementedError
968
976
 
@@ -970,7 +978,7 @@ class InterfaceBase:
970
978
  run_start = pb.RunStartRequest(run=self._make_run(run))
971
979
  return self._deliver_run_start(run_start)
972
980
 
973
- @abstractmethod
981
+ @abc.abstractmethod
974
982
  def _deliver_run_start(
975
983
  self, run_start: pb.RunStartRequest
976
984
  ) -> MailboxHandle[pb.Result]:
@@ -980,7 +988,7 @@ class InterfaceBase:
980
988
  attach = pb.AttachRequest(attach_id=attach_id)
981
989
  return self._deliver_attach(attach)
982
990
 
983
- @abstractmethod
991
+ @abc.abstractmethod
984
992
  def _deliver_attach(
985
993
  self,
986
994
  status: pb.AttachRequest,
@@ -991,7 +999,7 @@ class InterfaceBase:
991
999
  status = pb.StopStatusRequest()
992
1000
  return self._deliver_stop_status(status)
993
1001
 
994
- @abstractmethod
1002
+ @abc.abstractmethod
995
1003
  def _deliver_stop_status(
996
1004
  self,
997
1005
  status: pb.StopStatusRequest,
@@ -1002,7 +1010,7 @@ class InterfaceBase:
1002
1010
  status = pb.NetworkStatusRequest()
1003
1011
  return self._deliver_network_status(status)
1004
1012
 
1005
- @abstractmethod
1013
+ @abc.abstractmethod
1006
1014
  def _deliver_network_status(
1007
1015
  self,
1008
1016
  status: pb.NetworkStatusRequest,
@@ -1013,7 +1021,7 @@ class InterfaceBase:
1013
1021
  internal_message = pb.InternalMessagesRequest()
1014
1022
  return self._deliver_internal_messages(internal_message)
1015
1023
 
1016
- @abstractmethod
1024
+ @abc.abstractmethod
1017
1025
  def _deliver_internal_messages(
1018
1026
  self, internal_message: pb.InternalMessagesRequest
1019
1027
  ) -> MailboxHandle[pb.Result]:
@@ -1023,7 +1031,7 @@ class InterfaceBase:
1023
1031
  get_summary = pb.GetSummaryRequest()
1024
1032
  return self._deliver_get_summary(get_summary)
1025
1033
 
1026
- @abstractmethod
1034
+ @abc.abstractmethod
1027
1035
  def _deliver_get_summary(
1028
1036
  self,
1029
1037
  get_summary: pb.GetSummaryRequest,
@@ -1034,7 +1042,7 @@ class InterfaceBase:
1034
1042
  get_system_metrics = pb.GetSystemMetricsRequest()
1035
1043
  return self._deliver_get_system_metrics(get_system_metrics)
1036
1044
 
1037
- @abstractmethod
1045
+ @abc.abstractmethod
1038
1046
  def _deliver_get_system_metrics(
1039
1047
  self, get_summary: pb.GetSystemMetricsRequest
1040
1048
  ) -> MailboxHandle[pb.Result]:
@@ -1044,7 +1052,7 @@ class InterfaceBase:
1044
1052
  exit_data = self._make_exit(exit_code)
1045
1053
  return self._deliver_exit(exit_data)
1046
1054
 
1047
- @abstractmethod
1055
+ @abc.abstractmethod
1048
1056
  def _deliver_exit(
1049
1057
  self,
1050
1058
  exit_data: pb.RunExitRecord,
@@ -1055,7 +1063,7 @@ class InterfaceBase:
1055
1063
  poll_exit = pb.PollExitRequest()
1056
1064
  return self._deliver_poll_exit(poll_exit)
1057
1065
 
1058
- @abstractmethod
1066
+ @abc.abstractmethod
1059
1067
  def _deliver_poll_exit(
1060
1068
  self,
1061
1069
  poll_exit: pb.PollExitRequest,
@@ -1066,7 +1074,7 @@ class InterfaceBase:
1066
1074
  run_finish_without_exit = pb.RunFinishWithoutExitRequest()
1067
1075
  return self._deliver_finish_without_exit(run_finish_without_exit)
1068
1076
 
1069
- @abstractmethod
1077
+ @abc.abstractmethod
1070
1078
  def _deliver_finish_without_exit(
1071
1079
  self, run_finish_without_exit: pb.RunFinishWithoutExitRequest
1072
1080
  ) -> MailboxHandle[pb.Result]:
@@ -1076,7 +1084,7 @@ class InterfaceBase:
1076
1084
  sampled_history = pb.SampledHistoryRequest()
1077
1085
  return self._deliver_request_sampled_history(sampled_history)
1078
1086
 
1079
- @abstractmethod
1087
+ @abc.abstractmethod
1080
1088
  def _deliver_request_sampled_history(
1081
1089
  self, sampled_history: pb.SampledHistoryRequest
1082
1090
  ) -> MailboxHandle[pb.Result]:
@@ -1086,7 +1094,7 @@ class InterfaceBase:
1086
1094
  run_status = pb.RunStatusRequest()
1087
1095
  return self._deliver_request_run_status(run_status)
1088
1096
 
1089
- @abstractmethod
1097
+ @abc.abstractmethod
1090
1098
  def _deliver_request_run_status(
1091
1099
  self, run_status: pb.RunStatusRequest
1092
1100
  ) -> MailboxHandle[pb.Result]:
@@ -1,12 +1,8 @@
1
- """InterfaceQueue - Derived from InterfaceShared using queues to send to internal thread.
2
-
3
- See interface.py for how interface classes relate to each other.
4
-
5
- """
1
+ from __future__ import annotations
6
2
 
7
3
  import logging
8
4
  from multiprocessing.process import BaseProcess
9
- from typing import TYPE_CHECKING, Optional
5
+ from typing import TYPE_CHECKING
10
6
 
11
7
  from typing_extensions import override
12
8
 
@@ -23,11 +19,21 @@ logger = logging.getLogger("wandb")
23
19
 
24
20
 
25
21
  class InterfaceQueue(InterfaceShared):
22
+ """Legacy implementation of InterfaceShared.
23
+
24
+ This was used by legacy-service to pass messages back to itself before
25
+ the existence of wandb-core. It may be removed once legacy-service is
26
+ completely removed (including its use in `wandb sync`).
27
+
28
+ Since it was used by the internal service, it does not implement
29
+ the "deliver" methods, which are only used in the client.
30
+ """
31
+
26
32
  def __init__(
27
33
  self,
28
- record_q: Optional["Queue[pb.Record]"] = None,
29
- result_q: Optional["Queue[pb.Result]"] = None,
30
- process: Optional[BaseProcess] = None,
34
+ record_q: Queue[pb.Record] | None = None,
35
+ result_q: Queue[pb.Result] | None = None,
36
+ process: BaseProcess | None = None,
31
37
  ) -> None:
32
38
  self.record_q = record_q
33
39
  self.result_q = result_q
@@ -35,16 +41,19 @@ class InterfaceQueue(InterfaceShared):
35
41
  super().__init__()
36
42
 
37
43
  @override
38
- async def deliver_async(
39
- self,
40
- record: "pb.Record",
41
- ) -> "MailboxHandle[pb.Result]":
42
- raise NotImplementedError
43
-
44
- def _publish(self, record: "pb.Record", local: Optional[bool] = None) -> None:
44
+ def _publish(self, record: pb.Record, *, nowait: bool = False) -> None:
45
45
  if self._process and not self._process.is_alive():
46
46
  raise Exception("The wandb backend process has shutdown")
47
- if local:
48
- record.control.local = local
49
47
  if self.record_q:
50
48
  self.record_q.put(record)
49
+
50
+ @override
51
+ async def deliver_async(
52
+ self,
53
+ record: pb.Record,
54
+ ) -> MailboxHandle[pb.Result]:
55
+ raise NotImplementedError
56
+
57
+ @override
58
+ def _deliver(self, record: pb.Record) -> MailboxHandle[pb.Result]:
59
+ raise NotImplementedError
@@ -1,13 +1,9 @@
1
- """InterfaceShared - Derived from InterfaceBase - shared with InterfaceQueue and InterfaceSock.
2
-
3
- See interface.py for how interface classes relate to each other.
4
-
5
- """
6
-
1
+ import abc
7
2
  import logging
8
- from abc import abstractmethod
9
3
  from typing import Any, Optional, cast
10
4
 
5
+ from typing_extensions import override
6
+
11
7
  from wandb.proto import wandb_internal_pb2 as pb
12
8
  from wandb.proto import wandb_telemetry_pb2 as tpb
13
9
  from wandb.sdk.mailbox import MailboxHandle
@@ -18,22 +14,70 @@ from .interface import InterfaceBase
18
14
  logger = logging.getLogger("wandb")
19
15
 
20
16
 
21
- class InterfaceShared(InterfaceBase):
17
+ class InterfaceShared(InterfaceBase, abc.ABC):
18
+ """Partially implemented InterfaceBase.
19
+
20
+ There is little reason for this to exist separately from InterfaceBase,
21
+ which itself is not a pure abstract class and has no other direct
22
+ subclasses. Most methods are implemented in this class in terms of the
23
+ protected _publish and _deliver methods defined by subclasses.
24
+ """
25
+
22
26
  def __init__(self) -> None:
23
27
  super().__init__()
24
28
 
25
- def _publish_output(self, outdata: pb.OutputRecord) -> None:
29
+ @abc.abstractmethod
30
+ def _publish(
31
+ self,
32
+ record: pb.Record,
33
+ *,
34
+ nowait: bool = False,
35
+ ) -> None:
36
+ """Send a record to the internal service.
37
+
38
+ Args:
39
+ record: The record to send. This method assigns its stream ID.
40
+ nowait: If true, this does not block on socket IO and is safe
41
+ to call in W&B's asyncio thread, but it will also not slow
42
+ down even if the socket is blocked and allow data to accumulate
43
+ in the Python memory.
44
+ """
45
+
46
+ @abc.abstractmethod
47
+ def _deliver(self, record: pb.Record) -> "MailboxHandle[pb.Result]":
48
+ """Send a record to the internal service and return a response handle.
49
+
50
+ Args:
51
+ record: The record to send. This method assigns its stream ID.
52
+
53
+ Returns:
54
+ A mailbox handle for waiting for a response.
55
+ """
56
+
57
+ @override
58
+ def _publish_output(
59
+ self,
60
+ outdata: pb.OutputRecord,
61
+ *,
62
+ nowait: bool = False,
63
+ ) -> None:
26
64
  rec = pb.Record()
27
65
  rec.output.CopyFrom(outdata)
28
- self._publish(rec)
29
-
30
- def _publish_cancel(self, cancel: pb.CancelRequest) -> None:
31
- rec = self._make_request(cancel=cancel)
32
- self._publish(rec)
66
+ self._publish(rec, nowait=nowait)
33
67
 
34
- def _publish_output_raw(self, outdata: pb.OutputRawRecord) -> None:
68
+ @override
69
+ def _publish_output_raw(
70
+ self,
71
+ outdata: pb.OutputRawRecord,
72
+ *,
73
+ nowait: bool = False,
74
+ ) -> None:
35
75
  rec = pb.Record()
36
76
  rec.output_raw.CopyFrom(outdata)
77
+ self._publish(rec, nowait=nowait)
78
+
79
+ def _publish_cancel(self, cancel: pb.CancelRequest) -> None:
80
+ rec = self._make_request(cancel=cancel)
37
81
  self._publish(rec)
38
82
 
39
83
  def _publish_tbdata(self, tbrecord: pb.TBRecord) -> None:
@@ -258,17 +302,11 @@ class InterfaceShared(InterfaceBase):
258
302
  raise Exception("Invalid record")
259
303
  return record
260
304
 
261
- @abstractmethod
262
- def _publish(self, record: pb.Record, local: Optional[bool] = None) -> None:
263
- raise NotImplementedError
264
-
265
- def _deliver(self, record: pb.Record) -> "MailboxHandle[pb.Result]":
266
- raise NotImplementedError
267
-
268
305
  def _publish_defer(self, state: "pb.DeferRequest.DeferState.V") -> None:
269
306
  defer = pb.DeferRequest(state=state)
270
307
  rec = self._make_request(defer=defer)
271
- self._publish(rec, local=True)
308
+ rec.control.local = True
309
+ self._publish(rec)
272
310
 
273
311
  def publish_defer(self, state: int = 0) -> None:
274
312
  self._publish_defer(cast("pb.DeferRequest.DeferState.V", state))
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING, Any
4
+ from typing import TYPE_CHECKING
5
5
 
6
6
  from typing_extensions import override
7
7
 
@@ -31,17 +31,21 @@ class InterfaceSock(InterfaceShared):
31
31
  self._client = client
32
32
  self._stream_id = stream_id
33
33
 
34
- def _assign(self, record: Any) -> None:
35
- assert self._stream_id
34
+ def _assign(self, record: pb.Record) -> None:
36
35
  record._info.stream_id = self._stream_id
37
36
 
38
37
  @override
39
- def _publish(self, record: pb.Record, local: bool | None = None) -> None:
38
+ def _publish(self, record: pb.Record, *, nowait: bool = False) -> None:
40
39
  self._assign(record)
41
40
  request = spb.ServerRequest()
42
41
  request.record_publish.CopyFrom(record)
43
- self._asyncer.run(lambda: self._client.publish(request))
44
42
 
43
+ if nowait:
44
+ self._asyncer.run_soon(lambda: self._client.publish(request))
45
+ else:
46
+ self._asyncer.run(lambda: self._client.publish(request))
47
+
48
+ @override
45
49
  def _deliver(self, record: pb.Record) -> MailboxHandle[pb.Result]:
46
50
  return self._asyncer.run(lambda: self.deliver_async(record))
47
51
 
@@ -7,18 +7,18 @@ from typing import List, Optional
7
7
 
8
8
  from pydantic import Field
9
9
 
10
- from wandb._pydantic import GQLBase
10
+ from wandb._pydantic import GQLResult
11
11
 
12
12
 
13
- class ServerFeaturesQuery(GQLBase):
13
+ class ServerFeaturesQuery(GQLResult):
14
14
  server_info: Optional[ServerFeaturesQueryServerInfo] = Field(alias="serverInfo")
15
15
 
16
16
 
17
- class ServerFeaturesQueryServerInfo(GQLBase):
17
+ class ServerFeaturesQueryServerInfo(GQLResult):
18
18
  features: List[Optional[ServerFeaturesQueryServerInfoFeatures]]
19
19
 
20
20
 
21
- class ServerFeaturesQueryServerInfoFeatures(GQLBase):
21
+ class ServerFeaturesQueryServerInfoFeatures(GQLResult):
22
22
  name: str
23
23
  is_enabled: bool = Field(alias="isEnabled")
24
24