flwr 1.17.0__py3-none-any.whl → 1.19.0__py3-none-any.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 (286) hide show
  1. flwr/__init__.py +1 -1
  2. flwr/app/__init__.py +15 -0
  3. flwr/app/error.py +68 -0
  4. flwr/app/metadata.py +223 -0
  5. flwr/cli/__init__.py +1 -1
  6. flwr/cli/app.py +21 -2
  7. flwr/cli/build.py +83 -58
  8. flwr/cli/cli_user_auth_interceptor.py +1 -1
  9. flwr/cli/config_utils.py +53 -17
  10. flwr/cli/example.py +1 -1
  11. flwr/cli/install.py +1 -1
  12. flwr/cli/log.py +4 -4
  13. flwr/cli/login/__init__.py +1 -1
  14. flwr/cli/login/login.py +15 -8
  15. flwr/cli/ls.py +16 -37
  16. flwr/cli/new/__init__.py +1 -1
  17. flwr/cli/new/new.py +4 -4
  18. flwr/cli/new/templates/__init__.py +1 -1
  19. flwr/cli/new/templates/app/__init__.py +1 -1
  20. flwr/cli/new/templates/app/code/__init__.py +1 -1
  21. flwr/cli/new/templates/app/code/client.baseline.py.tpl +1 -1
  22. flwr/cli/new/templates/app/code/flwr_tune/__init__.py +1 -1
  23. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +4 -4
  24. flwr/cli/new/templates/app/code/model.baseline.py.tpl +1 -1
  25. flwr/cli/new/templates/app/code/server.baseline.py.tpl +2 -3
  26. flwr/cli/new/templates/app/code/task.sklearn.py.tpl +1 -1
  27. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +14 -17
  28. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +4 -4
  29. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  30. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  31. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  32. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  33. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  34. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  35. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  36. flwr/cli/run/__init__.py +1 -1
  37. flwr/cli/run/run.py +11 -19
  38. flwr/cli/stop.py +3 -3
  39. flwr/cli/utils.py +42 -17
  40. flwr/client/__init__.py +3 -3
  41. flwr/client/client.py +1 -1
  42. flwr/client/client_app.py +140 -138
  43. flwr/client/clientapp/__init__.py +1 -8
  44. flwr/client/clientapp/utils.py +1 -1
  45. flwr/client/dpfedavg_numpy_client.py +1 -1
  46. flwr/client/grpc_adapter_client/__init__.py +1 -1
  47. flwr/client/grpc_adapter_client/connection.py +5 -5
  48. flwr/client/grpc_rere_client/__init__.py +1 -1
  49. flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  50. flwr/client/grpc_rere_client/connection.py +131 -61
  51. flwr/client/grpc_rere_client/grpc_adapter.py +35 -7
  52. flwr/client/message_handler/__init__.py +1 -1
  53. flwr/client/message_handler/message_handler.py +2 -2
  54. flwr/client/mod/__init__.py +1 -1
  55. flwr/client/mod/centraldp_mods.py +1 -1
  56. flwr/client/mod/comms_mods.py +39 -20
  57. flwr/client/mod/localdp_mod.py +6 -6
  58. flwr/client/mod/secure_aggregation/__init__.py +1 -1
  59. flwr/client/mod/secure_aggregation/secagg_mod.py +1 -1
  60. flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
  61. flwr/client/mod/utils.py +1 -1
  62. flwr/client/numpy_client.py +1 -1
  63. flwr/client/rest_client/__init__.py +1 -1
  64. flwr/client/rest_client/connection.py +174 -68
  65. flwr/client/run_info_store.py +1 -1
  66. flwr/client/typing.py +1 -1
  67. flwr/clientapp/__init__.py +15 -0
  68. flwr/common/__init__.py +3 -3
  69. flwr/common/address.py +1 -1
  70. flwr/common/args.py +1 -1
  71. flwr/common/auth_plugin/__init__.py +3 -1
  72. flwr/common/auth_plugin/auth_plugin.py +30 -4
  73. flwr/common/config.py +1 -1
  74. flwr/common/constant.py +37 -8
  75. flwr/common/context.py +1 -1
  76. flwr/common/date.py +1 -1
  77. flwr/common/differential_privacy.py +1 -1
  78. flwr/common/differential_privacy_constants.py +1 -1
  79. flwr/common/dp.py +1 -1
  80. flwr/common/event_log_plugin/event_log_plugin.py +3 -3
  81. flwr/common/exit/exit.py +6 -6
  82. flwr/common/exit_handlers.py +31 -1
  83. flwr/common/grpc.py +1 -1
  84. flwr/common/heartbeat.py +165 -0
  85. flwr/common/inflatable.py +290 -0
  86. flwr/common/inflatable_grpc_utils.py +99 -0
  87. flwr/common/inflatable_rest_utils.py +99 -0
  88. flwr/common/inflatable_utils.py +341 -0
  89. flwr/common/logger.py +1 -1
  90. flwr/common/message.py +137 -252
  91. flwr/common/object_ref.py +1 -1
  92. flwr/common/parameter.py +1 -1
  93. flwr/common/pyproject.py +1 -1
  94. flwr/common/record/__init__.py +3 -2
  95. flwr/common/record/array.py +323 -0
  96. flwr/common/record/arrayrecord.py +121 -243
  97. flwr/common/record/configrecord.py +71 -16
  98. flwr/common/record/conversion_utils.py +2 -2
  99. flwr/common/record/metricrecord.py +71 -20
  100. flwr/common/record/recorddict.py +207 -90
  101. flwr/common/record/typeddict.py +1 -1
  102. flwr/common/recorddict_compat.py +2 -2
  103. flwr/common/retry_invoker.py +15 -11
  104. flwr/common/secure_aggregation/__init__.py +1 -1
  105. flwr/common/secure_aggregation/crypto/__init__.py +1 -1
  106. flwr/common/secure_aggregation/crypto/shamir.py +52 -30
  107. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -1
  108. flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
  109. flwr/common/secure_aggregation/quantization.py +1 -1
  110. flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  111. flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
  112. flwr/common/serde.py +60 -184
  113. flwr/common/serde_utils.py +175 -0
  114. flwr/common/telemetry.py +2 -2
  115. flwr/common/typing.py +6 -4
  116. flwr/common/version.py +1 -1
  117. flwr/compat/__init__.py +15 -0
  118. flwr/compat/client/__init__.py +15 -0
  119. flwr/{client → compat/client}/app.py +71 -211
  120. flwr/{client → compat/client}/grpc_client/__init__.py +1 -1
  121. flwr/{client → compat/client}/grpc_client/connection.py +13 -13
  122. flwr/compat/common/__init__.py +15 -0
  123. flwr/compat/server/__init__.py +15 -0
  124. flwr/compat/server/app.py +174 -0
  125. flwr/compat/simulation/__init__.py +15 -0
  126. flwr/proto/__init__.py +1 -1
  127. flwr/proto/fleet_pb2.py +32 -27
  128. flwr/proto/fleet_pb2.pyi +49 -35
  129. flwr/proto/fleet_pb2_grpc.py +117 -13
  130. flwr/proto/fleet_pb2_grpc.pyi +47 -6
  131. flwr/proto/heartbeat_pb2.py +33 -0
  132. flwr/proto/heartbeat_pb2.pyi +66 -0
  133. flwr/proto/heartbeat_pb2_grpc.py +4 -0
  134. flwr/proto/heartbeat_pb2_grpc.pyi +4 -0
  135. flwr/proto/message_pb2.py +28 -11
  136. flwr/proto/message_pb2.pyi +125 -0
  137. flwr/proto/recorddict_pb2.py +16 -28
  138. flwr/proto/recorddict_pb2.pyi +46 -64
  139. flwr/proto/run_pb2.py +24 -32
  140. flwr/proto/run_pb2.pyi +4 -52
  141. flwr/proto/serverappio_pb2.py +32 -23
  142. flwr/proto/serverappio_pb2.pyi +45 -3
  143. flwr/proto/serverappio_pb2_grpc.py +138 -34
  144. flwr/proto/serverappio_pb2_grpc.pyi +54 -13
  145. flwr/proto/simulationio_pb2.py +12 -11
  146. flwr/proto/simulationio_pb2_grpc.py +35 -0
  147. flwr/proto/simulationio_pb2_grpc.pyi +14 -0
  148. flwr/server/__init__.py +2 -2
  149. flwr/server/app.py +69 -187
  150. flwr/server/client_manager.py +1 -1
  151. flwr/server/client_proxy.py +1 -1
  152. flwr/server/compat/__init__.py +1 -1
  153. flwr/server/compat/app.py +1 -1
  154. flwr/server/compat/app_utils.py +51 -29
  155. flwr/server/compat/legacy_context.py +1 -1
  156. flwr/server/criterion.py +1 -1
  157. flwr/server/fleet_event_log_interceptor.py +2 -2
  158. flwr/server/grid/grid.py +3 -3
  159. flwr/server/grid/grpc_grid.py +104 -34
  160. flwr/server/grid/inmemory_grid.py +5 -4
  161. flwr/server/history.py +1 -1
  162. flwr/server/run_serverapp.py +1 -1
  163. flwr/server/server.py +1 -1
  164. flwr/server/server_app.py +65 -58
  165. flwr/server/server_config.py +1 -1
  166. flwr/server/serverapp/__init__.py +1 -1
  167. flwr/server/serverapp/app.py +19 -1
  168. flwr/server/serverapp_components.py +1 -1
  169. flwr/server/strategy/__init__.py +1 -1
  170. flwr/server/strategy/aggregate.py +1 -1
  171. flwr/server/strategy/bulyan.py +2 -2
  172. flwr/server/strategy/dp_adaptive_clipping.py +17 -17
  173. flwr/server/strategy/dp_fixed_clipping.py +17 -17
  174. flwr/server/strategy/dpfedavg_adaptive.py +1 -1
  175. flwr/server/strategy/dpfedavg_fixed.py +1 -1
  176. flwr/server/strategy/fault_tolerant_fedavg.py +1 -1
  177. flwr/server/strategy/fedadagrad.py +1 -1
  178. flwr/server/strategy/fedadam.py +1 -1
  179. flwr/server/strategy/fedavg.py +1 -1
  180. flwr/server/strategy/fedavg_android.py +1 -1
  181. flwr/server/strategy/fedavgm.py +1 -1
  182. flwr/server/strategy/fedmedian.py +1 -1
  183. flwr/server/strategy/fedopt.py +1 -1
  184. flwr/server/strategy/fedprox.py +1 -1
  185. flwr/server/strategy/fedtrimmedavg.py +1 -1
  186. flwr/server/strategy/fedxgb_bagging.py +1 -1
  187. flwr/server/strategy/fedxgb_cyclic.py +1 -1
  188. flwr/server/strategy/fedxgb_nn_avg.py +3 -2
  189. flwr/server/strategy/fedyogi.py +1 -1
  190. flwr/server/strategy/krum.py +1 -1
  191. flwr/server/strategy/qfedavg.py +1 -1
  192. flwr/server/strategy/strategy.py +1 -1
  193. flwr/server/superlink/__init__.py +1 -1
  194. flwr/server/superlink/ffs/__init__.py +3 -1
  195. flwr/server/superlink/ffs/disk_ffs.py +1 -1
  196. flwr/server/superlink/ffs/ffs.py +1 -1
  197. flwr/server/superlink/ffs/ffs_factory.py +1 -1
  198. flwr/server/superlink/fleet/__init__.py +1 -1
  199. flwr/server/superlink/fleet/grpc_adapter/__init__.py +1 -1
  200. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +14 -4
  201. flwr/server/superlink/fleet/grpc_bidi/__init__.py +1 -1
  202. flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
  203. flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
  204. flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
  205. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +13 -13
  206. flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
  207. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +102 -8
  208. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -1
  209. flwr/server/superlink/fleet/message_handler/__init__.py +1 -1
  210. flwr/server/superlink/fleet/message_handler/message_handler.py +136 -19
  211. flwr/server/superlink/fleet/rest_rere/__init__.py +1 -1
  212. flwr/server/superlink/fleet/rest_rere/rest_api.py +73 -12
  213. flwr/server/superlink/fleet/vce/__init__.py +1 -1
  214. flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
  215. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  216. flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
  217. flwr/server/superlink/fleet/vce/vce_api.py +7 -4
  218. flwr/server/superlink/linkstate/__init__.py +1 -1
  219. flwr/server/superlink/linkstate/in_memory_linkstate.py +139 -44
  220. flwr/server/superlink/linkstate/linkstate.py +54 -21
  221. flwr/server/superlink/linkstate/linkstate_factory.py +1 -1
  222. flwr/server/superlink/linkstate/sqlite_linkstate.py +150 -56
  223. flwr/server/superlink/linkstate/utils.py +34 -30
  224. flwr/server/superlink/serverappio/serverappio_grpc.py +3 -0
  225. flwr/server/superlink/serverappio/serverappio_servicer.py +211 -57
  226. flwr/server/superlink/simulation/__init__.py +1 -1
  227. flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
  228. flwr/server/superlink/simulation/simulationio_servicer.py +26 -2
  229. flwr/server/superlink/utils.py +45 -3
  230. flwr/server/typing.py +1 -1
  231. flwr/server/utils/__init__.py +1 -1
  232. flwr/server/utils/tensorboard.py +1 -1
  233. flwr/server/utils/validator.py +3 -3
  234. flwr/server/workflow/__init__.py +1 -1
  235. flwr/server/workflow/constant.py +1 -1
  236. flwr/server/workflow/default_workflows.py +1 -1
  237. flwr/server/workflow/secure_aggregation/__init__.py +1 -1
  238. flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -1
  239. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -1
  240. flwr/serverapp/__init__.py +15 -0
  241. flwr/simulation/__init__.py +1 -1
  242. flwr/simulation/app.py +18 -1
  243. flwr/simulation/legacy_app.py +1 -1
  244. flwr/simulation/ray_transport/__init__.py +1 -1
  245. flwr/simulation/ray_transport/ray_actor.py +1 -1
  246. flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
  247. flwr/simulation/ray_transport/utils.py +1 -1
  248. flwr/simulation/run_simulation.py +2 -2
  249. flwr/simulation/simulationio_connection.py +1 -1
  250. flwr/supercore/__init__.py +15 -0
  251. flwr/supercore/object_store/__init__.py +24 -0
  252. flwr/supercore/object_store/in_memory_object_store.py +229 -0
  253. flwr/supercore/object_store/object_store.py +192 -0
  254. flwr/supercore/object_store/object_store_factory.py +44 -0
  255. flwr/superexec/__init__.py +1 -1
  256. flwr/superexec/app.py +1 -1
  257. flwr/superexec/deployment.py +7 -3
  258. flwr/superexec/exec_event_log_interceptor.py +4 -4
  259. flwr/superexec/exec_grpc.py +8 -4
  260. flwr/superexec/exec_servicer.py +126 -24
  261. flwr/superexec/exec_user_auth_interceptor.py +38 -9
  262. flwr/superexec/executor.py +5 -1
  263. flwr/superexec/simulation.py +8 -2
  264. flwr/superlink/__init__.py +15 -0
  265. flwr/{client/supernode → supernode}/__init__.py +1 -8
  266. flwr/{client/nodestate/nodestate.py → supernode/cli/__init__.py} +8 -15
  267. flwr/{client/supernode/app.py → supernode/cli/flower_supernode.py} +4 -13
  268. flwr/supernode/cli/flwr_clientapp.py +81 -0
  269. flwr/{client → supernode}/nodestate/__init__.py +1 -1
  270. flwr/supernode/nodestate/in_memory_nodestate.py +190 -0
  271. flwr/supernode/nodestate/nodestate.py +212 -0
  272. flwr/{client → supernode}/nodestate/nodestate_factory.py +1 -1
  273. flwr/supernode/runtime/__init__.py +15 -0
  274. flwr/{client/clientapp/app.py → supernode/runtime/run_clientapp.py} +26 -57
  275. flwr/supernode/servicer/__init__.py +15 -0
  276. flwr/supernode/servicer/clientappio/__init__.py +24 -0
  277. flwr/{client/clientapp → supernode/servicer/clientappio}/clientappio_servicer.py +1 -1
  278. flwr/supernode/start_client_internal.py +491 -0
  279. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/METADATA +6 -5
  280. flwr-1.19.0.dist-info/RECORD +365 -0
  281. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/WHEEL +1 -1
  282. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/entry_points.txt +2 -2
  283. flwr/client/heartbeat.py +0 -74
  284. flwr/client/nodestate/in_memory_nodestate.py +0 -38
  285. flwr-1.17.0.dist-info/LICENSE +0 -202
  286. flwr-1.17.0.dist-info/RECORD +0 -333
@@ -1,4 +1,4 @@
1
- # Copyright 2020 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -104,18 +104,18 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
104
104
 
105
105
  Examples
106
106
  --------
107
- Establishing a SSL-enabled connection to the server:
108
-
109
- >>> from pathlib import Path
110
- >>> with grpc_connection(
111
- >>> server_address,
112
- >>> max_message_length=max_message_length,
113
- >>> root_certificates=Path("/crts/root.pem").read_bytes(),
114
- >>> ) as conn:
115
- >>> receive, send = conn
116
- >>> server_message = receive()
117
- >>> # do something here
118
- >>> send(client_message)
107
+ Establishing a TLS-enabled connection to the server::
108
+
109
+ from pathlib import Path
110
+ with grpc_connection(
111
+ server_address,
112
+ max_message_length=max_message_length,
113
+ root_certificates=Path("/crts/root.pem").read_bytes(),
114
+ ) as conn:
115
+ receive, send = conn
116
+ server_message = receive()
117
+ # do something here
118
+ send(client_message)
119
119
  """
120
120
  if isinstance(root_certificates, str):
121
121
  root_certificates = Path(root_certificates).read_bytes()
@@ -0,0 +1,15 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Legacy components previously located in ``flwr.common``."""
@@ -0,0 +1,15 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Legacy components previously located in ``flwr.server``."""
@@ -0,0 +1,174 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower server app."""
16
+
17
+
18
+ import sys
19
+ from logging import INFO
20
+ from typing import Optional
21
+
22
+ from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
23
+ from flwr.common.address import parse_address
24
+ from flwr.common.constant import FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS
25
+ from flwr.common.exit_handlers import register_exit_handlers
26
+ from flwr.common.logger import log, warn_deprecated_feature
27
+ from flwr.server.client_manager import ClientManager
28
+ from flwr.server.history import History
29
+ from flwr.server.server import Server, init_defaults, run_fl
30
+ from flwr.server.server_config import ServerConfig
31
+ from flwr.server.strategy import Strategy
32
+ from flwr.server.superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
33
+
34
+
35
+ def start_server( # pylint: disable=too-many-arguments,too-many-locals
36
+ *,
37
+ server_address: str = FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
38
+ server: Optional[Server] = None,
39
+ config: Optional[ServerConfig] = None,
40
+ strategy: Optional[Strategy] = None,
41
+ client_manager: Optional[ClientManager] = None,
42
+ grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
43
+ certificates: Optional[tuple[bytes, bytes, bytes]] = None,
44
+ ) -> History:
45
+ """Start a Flower server using the gRPC transport layer.
46
+
47
+ Warning
48
+ -------
49
+ This function is deprecated since 1.13.0. Use the :code:`flower-superlink` command
50
+ instead to start a SuperLink.
51
+
52
+ Parameters
53
+ ----------
54
+ server_address : Optional[str]
55
+ The IPv4 or IPv6 address of the server. Defaults to `"[::]:8080"`.
56
+ server : Optional[flwr.server.Server] (default: None)
57
+ A server implementation, either `flwr.server.Server` or a subclass
58
+ thereof. If no instance is provided, then `start_server` will create
59
+ one.
60
+ config : Optional[ServerConfig] (default: None)
61
+ Currently supported values are `num_rounds` (int, default: 1) and
62
+ `round_timeout` in seconds (float, default: None).
63
+ strategy : Optional[flwr.server.Strategy] (default: None).
64
+ An implementation of the abstract base class
65
+ `flwr.server.strategy.Strategy`. If no strategy is provided, then
66
+ `start_server` will use `flwr.server.strategy.FedAvg`.
67
+ client_manager : Optional[flwr.server.ClientManager] (default: None)
68
+ An implementation of the abstract base class
69
+ `flwr.server.ClientManager`. If no implementation is provided, then
70
+ `start_server` will use
71
+ `flwr.server.client_manager.SimpleClientManager`.
72
+ grpc_max_message_length : int (default: 536_870_912, this equals 512MB)
73
+ The maximum length of gRPC messages that can be exchanged with the
74
+ Flower clients. The default should be sufficient for most models.
75
+ Users who train very large models might need to increase this
76
+ value. Note that the Flower clients need to be started with the
77
+ same value (see `flwr.client.start_client`), otherwise clients will
78
+ not know about the increased limit and block larger messages.
79
+ certificates : Tuple[bytes, bytes, bytes] (default: None)
80
+ Tuple containing root certificate, server certificate, and private key
81
+ to start a secure SSL-enabled server. The tuple is expected to have
82
+ three bytes elements in the following order:
83
+
84
+ * CA certificate.
85
+ * server certificate.
86
+ * server private key.
87
+
88
+ Returns
89
+ -------
90
+ hist : flwr.server.history.History
91
+ Object containing training and evaluation metrics.
92
+
93
+ Examples
94
+ --------
95
+ Starting an insecure server::
96
+
97
+ start_server()
98
+
99
+ Starting a TLS-enabled server::
100
+
101
+ start_server(
102
+ certificates=(
103
+ Path("/crts/root.pem").read_bytes(),
104
+ Path("/crts/localhost.crt").read_bytes(),
105
+ Path("/crts/localhost.key").read_bytes()
106
+ )
107
+ )
108
+ """
109
+ msg = (
110
+ "flwr.server.start_server() is deprecated."
111
+ "\n\tInstead, use the `flower-superlink` CLI command to start a SuperLink "
112
+ "as shown below:"
113
+ "\n\n\t\t$ flower-superlink --insecure"
114
+ "\n\n\tTo view usage and all available options, run:"
115
+ "\n\n\t\t$ flower-superlink --help"
116
+ "\n\n\tUsing `start_server()` is deprecated."
117
+ )
118
+ warn_deprecated_feature(name=msg)
119
+
120
+ event(EventType.START_SERVER_ENTER)
121
+
122
+ # Parse IP address
123
+ parsed_address = parse_address(server_address)
124
+ if not parsed_address:
125
+ sys.exit(f"Server IP address ({server_address}) cannot be parsed.")
126
+ host, port, is_v6 = parsed_address
127
+ address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
128
+
129
+ # Initialize server and server config
130
+ initialized_server, initialized_config = init_defaults(
131
+ server=server,
132
+ config=config,
133
+ strategy=strategy,
134
+ client_manager=client_manager,
135
+ )
136
+ log(
137
+ INFO,
138
+ "Starting Flower server, config: %s",
139
+ initialized_config,
140
+ )
141
+
142
+ # Start gRPC server
143
+ grpc_server = start_grpc_server(
144
+ client_manager=initialized_server.client_manager(),
145
+ server_address=address,
146
+ max_message_length=grpc_max_message_length,
147
+ certificates=certificates,
148
+ )
149
+ log(
150
+ INFO,
151
+ "Flower ECE: gRPC server running (%s rounds), SSL is %s",
152
+ initialized_config.num_rounds,
153
+ "enabled" if certificates is not None else "disabled",
154
+ )
155
+
156
+ # Graceful shutdown
157
+ register_exit_handlers(
158
+ event_type=EventType.START_SERVER_LEAVE,
159
+ exit_message="Flower server terminated gracefully.",
160
+ grpc_servers=[grpc_server],
161
+ )
162
+
163
+ # Start training
164
+ hist = run_fl(
165
+ server=initialized_server,
166
+ config=initialized_config,
167
+ )
168
+
169
+ # Stop the gRPC server
170
+ grpc_server.stop(grace=1)
171
+
172
+ event(EventType.START_SERVER_LEAVE)
173
+
174
+ return hist
@@ -0,0 +1,15 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Legacy components previously located in ``flwr.simulation``."""
flwr/proto/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2020 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
flwr/proto/fleet_pb2.py CHANGED
@@ -12,45 +12,50 @@ from google.protobuf.internal import builder as _builder
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
+ from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
15
16
  from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
16
17
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
17
18
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
18
19
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
19
20
 
20
21
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"*\n\x11\x43reateNodeRequest\x12\x15\n\rping_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"D\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x15\n\rping_interval\x18\x02 \x01(\x01\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"l\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"a\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\"\xb0\x01\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\x92\x04\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\x87\x02\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12L\n\x0fobjects_to_pull\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PullMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x97\x01\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xca\x06\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
22
23
 
23
24
  _globals = globals()
24
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
25
26
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
26
27
  if _descriptor._USE_C_DESCRIPTORS == False:
27
28
  DESCRIPTOR._options = None
29
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
30
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_options = b'8\001'
28
31
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
29
32
  _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
30
- _globals['_CREATENODEREQUEST']._serialized_start=131
31
- _globals['_CREATENODEREQUEST']._serialized_end=173
32
- _globals['_CREATENODERESPONSE']._serialized_start=175
33
- _globals['_CREATENODERESPONSE']._serialized_end=227
34
- _globals['_DELETENODEREQUEST']._serialized_start=229
35
- _globals['_DELETENODEREQUEST']._serialized_end=280
36
- _globals['_DELETENODERESPONSE']._serialized_start=282
37
- _globals['_DELETENODERESPONSE']._serialized_end=302
38
- _globals['_PINGREQUEST']._serialized_start=304
39
- _globals['_PINGREQUEST']._serialized_end=372
40
- _globals['_PINGRESPONSE']._serialized_start=374
41
- _globals['_PINGRESPONSE']._serialized_end=405
42
- _globals['_PULLMESSAGESREQUEST']._serialized_start=407
43
- _globals['_PULLMESSAGESREQUEST']._serialized_end=481
44
- _globals['_PULLMESSAGESRESPONSE']._serialized_start=483
45
- _globals['_PULLMESSAGESRESPONSE']._serialized_end=591
46
- _globals['_PUSHMESSAGESREQUEST']._serialized_start=593
47
- _globals['_PUSHMESSAGESREQUEST']._serialized_end=690
48
- _globals['_PUSHMESSAGESRESPONSE']._serialized_start=693
49
- _globals['_PUSHMESSAGESRESPONSE']._serialized_end=869
50
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=823
51
- _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=869
52
- _globals['_RECONNECT']._serialized_start=871
53
- _globals['_RECONNECT']._serialized_end=901
54
- _globals['_FLEET']._serialized_start=904
55
- _globals['_FLEET']._serialized_end=1434
33
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
34
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
35
+ _globals['_CREATENODEREQUEST']._serialized_start=159
36
+ _globals['_CREATENODEREQUEST']._serialized_end=206
37
+ _globals['_CREATENODERESPONSE']._serialized_start=208
38
+ _globals['_CREATENODERESPONSE']._serialized_end=260
39
+ _globals['_DELETENODEREQUEST']._serialized_start=262
40
+ _globals['_DELETENODEREQUEST']._serialized_end=313
41
+ _globals['_DELETENODERESPONSE']._serialized_start=315
42
+ _globals['_DELETENODERESPONSE']._serialized_end=335
43
+ _globals['_PULLMESSAGESREQUEST']._serialized_start=337
44
+ _globals['_PULLMESSAGESREQUEST']._serialized_end=411
45
+ _globals['_PULLMESSAGESRESPONSE']._serialized_start=414
46
+ _globals['_PULLMESSAGESRESPONSE']._serialized_end=677
47
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=602
48
+ _globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=677
49
+ _globals['_PUSHMESSAGESREQUEST']._serialized_start=680
50
+ _globals['_PUSHMESSAGESREQUEST']._serialized_end=831
51
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_start=834
52
+ _globals['_PUSHMESSAGESRESPONSE']._serialized_end=1165
53
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1042
54
+ _globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1088
55
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=1090
56
+ _globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1165
57
+ _globals['_RECONNECT']._serialized_start=1167
58
+ _globals['_RECONNECT']._serialized_end=1197
59
+ _globals['_FLEET']._serialized_start=1200
60
+ _globals['_FLEET']._serialized_end=2042
56
61
  # @@protoc_insertion_point(module_scope)
flwr/proto/fleet_pb2.pyi CHANGED
@@ -16,13 +16,13 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
16
16
  class CreateNodeRequest(google.protobuf.message.Message):
17
17
  """CreateNode messages"""
18
18
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
19
- PING_INTERVAL_FIELD_NUMBER: builtins.int
20
- ping_interval: builtins.float
19
+ HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
20
+ heartbeat_interval: builtins.float
21
21
  def __init__(self,
22
22
  *,
23
- ping_interval: builtins.float = ...,
23
+ heartbeat_interval: builtins.float = ...,
24
24
  ) -> None: ...
25
- def ClearField(self, field_name: typing_extensions.Literal["ping_interval",b"ping_interval"]) -> None: ...
25
+ def ClearField(self, field_name: typing_extensions.Literal["heartbeat_interval",b"heartbeat_interval"]) -> None: ...
26
26
  global___CreateNodeRequest = CreateNodeRequest
27
27
 
28
28
  class CreateNodeResponse(google.protobuf.message.Message):
@@ -58,34 +58,6 @@ class DeleteNodeResponse(google.protobuf.message.Message):
58
58
  ) -> None: ...
59
59
  global___DeleteNodeResponse = DeleteNodeResponse
60
60
 
61
- class PingRequest(google.protobuf.message.Message):
62
- """Ping messages"""
63
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
64
- NODE_FIELD_NUMBER: builtins.int
65
- PING_INTERVAL_FIELD_NUMBER: builtins.int
66
- @property
67
- def node(self) -> flwr.proto.node_pb2.Node: ...
68
- ping_interval: builtins.float
69
- def __init__(self,
70
- *,
71
- node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
72
- ping_interval: builtins.float = ...,
73
- ) -> None: ...
74
- def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
75
- def ClearField(self, field_name: typing_extensions.Literal["node",b"node","ping_interval",b"ping_interval"]) -> None: ...
76
- global___PingRequest = PingRequest
77
-
78
- class PingResponse(google.protobuf.message.Message):
79
- DESCRIPTOR: google.protobuf.descriptor.Descriptor
80
- SUCCESS_FIELD_NUMBER: builtins.int
81
- success: builtins.bool
82
- def __init__(self,
83
- *,
84
- success: builtins.bool = ...,
85
- ) -> None: ...
86
- def ClearField(self, field_name: typing_extensions.Literal["success",b"success"]) -> None: ...
87
- global___PingResponse = PingResponse
88
-
89
61
  class PullMessagesRequest(google.protobuf.message.Message):
90
62
  """PullMessages messages"""
91
63
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -106,19 +78,38 @@ global___PullMessagesRequest = PullMessagesRequest
106
78
 
107
79
  class PullMessagesResponse(google.protobuf.message.Message):
108
80
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
81
+ class ObjectsToPullEntry(google.protobuf.message.Message):
82
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
83
+ KEY_FIELD_NUMBER: builtins.int
84
+ VALUE_FIELD_NUMBER: builtins.int
85
+ key: typing.Text
86
+ @property
87
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
88
+ def __init__(self,
89
+ *,
90
+ key: typing.Text = ...,
91
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
92
+ ) -> None: ...
93
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
94
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
95
+
109
96
  RECONNECT_FIELD_NUMBER: builtins.int
110
97
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
98
+ OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
111
99
  @property
112
100
  def reconnect(self) -> global___Reconnect: ...
113
101
  @property
114
102
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
103
+ @property
104
+ def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
115
105
  def __init__(self,
116
106
  *,
117
107
  reconnect: typing.Optional[global___Reconnect] = ...,
118
108
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
109
+ objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
119
110
  ) -> None: ...
120
111
  def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
121
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","reconnect",b"reconnect"]) -> None: ...
112
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull","reconnect",b"reconnect"]) -> None: ...
122
113
  global___PullMessagesResponse = PullMessagesResponse
123
114
 
124
115
  class PushMessagesRequest(google.protobuf.message.Message):
@@ -126,17 +117,21 @@ class PushMessagesRequest(google.protobuf.message.Message):
126
117
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
127
118
  NODE_FIELD_NUMBER: builtins.int
128
119
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
120
+ MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
129
121
  @property
130
122
  def node(self) -> flwr.proto.node_pb2.Node: ...
131
123
  @property
132
124
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
125
+ @property
126
+ def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
133
127
  def __init__(self,
134
128
  *,
135
129
  node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
136
130
  messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
131
+ message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
137
132
  ) -> None: ...
138
133
  def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
139
- def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","node",b"node"]) -> None: ...
134
+ def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list","node",b"node"]) -> None: ...
140
135
  global___PushMessagesRequest = PushMessagesRequest
141
136
 
142
137
  class PushMessagesResponse(google.protobuf.message.Message):
@@ -154,19 +149,38 @@ class PushMessagesResponse(google.protobuf.message.Message):
154
149
  ) -> None: ...
155
150
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
156
151
 
152
+ class ObjectsToPushEntry(google.protobuf.message.Message):
153
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
154
+ KEY_FIELD_NUMBER: builtins.int
155
+ VALUE_FIELD_NUMBER: builtins.int
156
+ key: typing.Text
157
+ @property
158
+ def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
159
+ def __init__(self,
160
+ *,
161
+ key: typing.Text = ...,
162
+ value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
163
+ ) -> None: ...
164
+ def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
165
+ def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
166
+
157
167
  RECONNECT_FIELD_NUMBER: builtins.int
158
168
  RESULTS_FIELD_NUMBER: builtins.int
169
+ OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
159
170
  @property
160
171
  def reconnect(self) -> global___Reconnect: ...
161
172
  @property
162
173
  def results(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, builtins.int]: ...
174
+ @property
175
+ def objects_to_push(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
163
176
  def __init__(self,
164
177
  *,
165
178
  reconnect: typing.Optional[global___Reconnect] = ...,
166
179
  results: typing.Optional[typing.Mapping[typing.Text, builtins.int]] = ...,
180
+ objects_to_push: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
167
181
  ) -> None: ...
168
182
  def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
169
- def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
183
+ def ClearField(self, field_name: typing_extensions.Literal["objects_to_push",b"objects_to_push","reconnect",b"reconnect","results",b"results"]) -> None: ...
170
184
  global___PushMessagesResponse = PushMessagesResponse
171
185
 
172
186
  class Reconnect(google.protobuf.message.Message):