flwr 1.24.0__py3-none-any.whl → 1.25.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 (96) hide show
  1. flwr/cli/app_cmd/review.py +13 -3
  2. flwr/cli/federation/show.py +4 -3
  3. flwr/cli/ls.py +44 -3
  4. flwr/cli/new/new.py +106 -297
  5. flwr/cli/run/run.py +12 -17
  6. flwr/cli/run_utils.py +23 -5
  7. flwr/cli/stop.py +1 -1
  8. flwr/cli/supernode/ls.py +10 -5
  9. flwr/cli/utils.py +0 -137
  10. flwr/client/grpc_adapter_client/connection.py +2 -2
  11. flwr/client/grpc_rere_client/connection.py +6 -3
  12. flwr/client/rest_client/connection.py +6 -4
  13. flwr/common/serde.py +6 -0
  14. flwr/common/typing.py +6 -0
  15. flwr/proto/fleet_pb2.py +10 -10
  16. flwr/proto/fleet_pb2.pyi +5 -1
  17. flwr/proto/run_pb2.py +24 -24
  18. flwr/proto/run_pb2.pyi +10 -1
  19. flwr/server/app.py +1 -0
  20. flwr/server/superlink/fleet/message_handler/message_handler.py +41 -2
  21. flwr/server/superlink/linkstate/in_memory_linkstate.py +34 -0
  22. flwr/server/superlink/linkstate/linkstate.py +32 -0
  23. flwr/server/superlink/linkstate/sqlite_linkstate.py +60 -3
  24. flwr/supercore/constant.py +3 -0
  25. flwr/supercore/utils.py +190 -0
  26. flwr/superlink/servicer/control/control_grpc.py +2 -0
  27. flwr/superlink/servicer/control/control_servicer.py +88 -5
  28. flwr/supernode/nodestate/in_memory_nodestate.py +62 -1
  29. flwr/supernode/nodestate/nodestate.py +45 -0
  30. flwr/supernode/servicer/clientappio/clientappio_servicer.py +7 -1
  31. flwr/supernode/start_client_internal.py +7 -4
  32. {flwr-1.24.0.dist-info → flwr-1.25.0.dist-info}/METADATA +2 -4
  33. {flwr-1.24.0.dist-info → flwr-1.25.0.dist-info}/RECORD +35 -96
  34. flwr/cli/new/templates/__init__.py +0 -15
  35. flwr/cli/new/templates/app/.gitignore.tpl +0 -163
  36. flwr/cli/new/templates/app/LICENSE.tpl +0 -202
  37. flwr/cli/new/templates/app/README.baseline.md.tpl +0 -127
  38. flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -68
  39. flwr/cli/new/templates/app/README.md.tpl +0 -37
  40. flwr/cli/new/templates/app/__init__.py +0 -15
  41. flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -1
  42. flwr/cli/new/templates/app/code/__init__.py +0 -15
  43. flwr/cli/new/templates/app/code/__init__.py.tpl +0 -1
  44. flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -1
  45. flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -75
  46. flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -93
  47. flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -71
  48. flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -102
  49. flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -46
  50. flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -80
  51. flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -55
  52. flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -108
  53. flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -82
  54. flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -110
  55. flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -36
  56. flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -15
  57. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -92
  58. flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -87
  59. flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -56
  60. flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -73
  61. flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -78
  62. flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -66
  63. flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -43
  64. flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -42
  65. flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -39
  66. flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -41
  67. flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -38
  68. flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -41
  69. flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -31
  70. flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -44
  71. flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -38
  72. flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -56
  73. flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -1
  74. flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -98
  75. flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -57
  76. flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -102
  77. flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -7
  78. flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -99
  79. flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -111
  80. flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -67
  81. flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -52
  82. flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -67
  83. flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -1
  84. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -146
  85. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -80
  86. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -65
  87. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -52
  88. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -56
  89. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -49
  90. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -53
  91. flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -53
  92. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -52
  93. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -53
  94. flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -61
  95. {flwr-1.24.0.dist-info → flwr-1.25.0.dist-info}/WHEEL +0 -0
  96. {flwr-1.24.0.dist-info → flwr-1.25.0.dist-info}/entry_points.txt +0 -0
@@ -19,7 +19,7 @@ from collections.abc import Sequence
19
19
  from dataclasses import dataclass
20
20
  from threading import Lock, RLock
21
21
 
22
- from flwr.common import Context, Error, Message
22
+ from flwr.common import Context, Error, Message, now
23
23
  from flwr.common.constant import ErrorCode
24
24
  from flwr.common.inflatable import (
25
25
  get_all_nested_objects,
@@ -27,6 +27,7 @@ from flwr.common.inflatable import (
27
27
  no_object_id_recompute,
28
28
  )
29
29
  from flwr.common.typing import Run
30
+ from flwr.supercore.constant import MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS
30
31
  from flwr.supercore.corestate.in_memory_corestate import InMemoryCoreState
31
32
  from flwr.supercore.object_store import ObjectStore
32
33
 
@@ -45,6 +46,14 @@ class MessageEntry:
45
46
  is_retrieved: bool = False
46
47
 
47
48
 
49
+ @dataclass
50
+ class TimeEntry:
51
+ """Data class to represent a time entry."""
52
+
53
+ starting_at: float
54
+ finished_at: float | None = None
55
+
56
+
48
57
  class InMemoryNodeState(
49
58
  NodeState, InMemoryCoreState
50
59
  ): # pylint: disable=too-many-instance-attributes
@@ -63,6 +72,9 @@ class InMemoryNodeState(
63
72
  # Store run ID to Context mapping
64
73
  self.ctx_store: dict[int, Context] = {}
65
74
  self.lock_ctx_store = Lock()
75
+ # Store msg ID to TimeEntry mapping
76
+ self.time_store: dict[str, TimeEntry] = {}
77
+ self.lock_time_store = Lock()
66
78
 
67
79
  def set_node_id(self, node_id: int | None) -> None:
68
80
  """Set the node ID."""
@@ -208,3 +220,52 @@ class InMemoryNodeState(
208
220
 
209
221
  # Store the error reply message
210
222
  self.store_message(error_reply)
223
+
224
+ def record_message_processing_start(self, message_id: str) -> None:
225
+ """Record the start time of message processing based on the message ID."""
226
+ with self.lock_time_store:
227
+ self.time_store[message_id] = TimeEntry(starting_at=now().timestamp())
228
+
229
+ def record_message_processing_end(self, message_id: str) -> None:
230
+ """Record the end time of message processing based on the message ID."""
231
+ with self.lock_time_store:
232
+ if message_id not in self.time_store:
233
+ raise ValueError(
234
+ f"Cannot record end time: Message ID {message_id} not found."
235
+ )
236
+ entry = self.time_store[message_id]
237
+ entry.finished_at = now().timestamp()
238
+
239
+ def get_message_processing_duration(self, message_id: str) -> float:
240
+ """Get the message processing duration based on the message ID."""
241
+ # Cleanup old message processing times
242
+ self._cleanup_old_message_times()
243
+ with self.lock_time_store:
244
+ if message_id not in self.time_store:
245
+ raise ValueError(f"Message ID {message_id} not found.")
246
+
247
+ entry = self.time_store[message_id]
248
+ if entry.starting_at is None or entry.finished_at is None:
249
+ raise ValueError(
250
+ f"Start time or end time for message ID {message_id} is missing."
251
+ )
252
+
253
+ duration = entry.finished_at - entry.starting_at
254
+ return duration
255
+
256
+ def _cleanup_old_message_times(self) -> None:
257
+ """Remove time entries older than MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS."""
258
+ with self.lock_time_store:
259
+ cutoff = now().timestamp() - MESSAGE_TIME_ENTRY_MAX_AGE_SECONDS
260
+ # Find message IDs for entries that have a finishing_at time
261
+ # before the cutoff, and those that don't exist in msg_store
262
+ to_delete = [
263
+ msg_id
264
+ for msg_id, entry in self.time_store.items()
265
+ if (entry.finished_at and entry.finished_at < cutoff)
266
+ or msg_id not in self.msg_store
267
+ ]
268
+
269
+ # Delete the identified entries
270
+ for msg_id in to_delete:
271
+ del self.time_store[msg_id]
@@ -168,3 +168,48 @@ class NodeState(CoreState):
168
168
  Sequence[int]
169
169
  Sequence of run IDs with pending messages.
170
170
  """
171
+
172
+ @abstractmethod
173
+ def record_message_processing_start(self, message_id: str) -> None:
174
+ """Record the start time of message processing based on the message ID.
175
+
176
+ Parameters
177
+ ----------
178
+ message_id : str
179
+ The ID of the message associated with the start time.
180
+ """
181
+
182
+ @abstractmethod
183
+ def record_message_processing_end(self, message_id: str) -> None:
184
+ """Record the end time of message processing based on the message ID.
185
+
186
+ Parameters
187
+ ----------
188
+ message_id : str
189
+ The ID of the message associated with the end time.
190
+
191
+ Raises
192
+ ------
193
+ ValueError
194
+ If the message ID is not found.
195
+ """
196
+
197
+ @abstractmethod
198
+ def get_message_processing_duration(self, message_id: str) -> float:
199
+ """Get the message processing duration based on the message ID.
200
+
201
+ Parameters
202
+ ----------
203
+ message_id : str
204
+ The ID of the message.
205
+
206
+ Returns
207
+ -------
208
+ float
209
+ The processing duration in seconds.
210
+
211
+ Raises
212
+ ------
213
+ ValueError
214
+ If the message ID is not found, or if start/end times are missing.
215
+ """
@@ -223,6 +223,9 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
223
223
  # Retrieve message for this run
224
224
  message = state.get_messages(run_ids=[run_id], is_reply=False)[0]
225
225
 
226
+ # Record message processing start time
227
+ state.record_message_processing_start(message_id=message.metadata.message_id)
228
+
226
229
  # Retrieve the object tree for the message
227
230
  object_tree = store.get_object_tree(message.metadata.message_id)
228
231
 
@@ -254,7 +257,10 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
254
257
  objects_to_push |= set(store.preregister(run_id, object_tree))
255
258
  # Save the message to the state
256
259
  state.store_message(message_from_proto(request.messages_list[0]))
257
-
260
+ # Record message processing end time
261
+ state.record_message_processing_end(
262
+ message_id=request.messages_list[0].metadata.reply_to_message_id
263
+ )
258
264
  return PushAppMessagesResponse(objects_to_push=objects_to_push)
259
265
 
260
266
  def SendAppHeartbeat(
@@ -432,7 +432,7 @@ def _pull_and_store_message( # pylint: disable=too-many-positional-arguments
432
432
  def _push_messages(
433
433
  state: NodeState,
434
434
  object_store: ObjectStore,
435
- send: Callable[[Message, ObjectTree], set[str]],
435
+ send: Callable[[Message, ObjectTree, float], set[str]],
436
436
  push_object: Callable[[int, str, bytes], None],
437
437
  ) -> None:
438
438
  """Push reply messages to the SuperLink."""
@@ -480,9 +480,12 @@ def _push_messages(
480
480
 
481
481
  # Send the message
482
482
  try:
483
- # Send the reply message with its ObjectTree
483
+ clientapp_runtime = state.get_message_processing_duration(
484
+ message_id=message.metadata.reply_to_message_id,
485
+ )
486
+ # Send the reply message with its ObjectTree and ClientApp runtime
484
487
  # Get the IDs of objects to send
485
- ids_obj_to_send = send(message, object_tree)
488
+ ids_obj_to_send = send(message, object_tree, clientapp_runtime)
486
489
 
487
490
  # Push object contents from the ObjectStore
488
491
  run_id = message.metadata.run_id
@@ -539,7 +542,7 @@ def _init_connection( # pylint: disable=too-many-positional-arguments
539
542
  tuple[
540
543
  int,
541
544
  Callable[[], tuple[Message, ObjectTree] | None],
542
- Callable[[Message, ObjectTree], set[str]],
545
+ Callable[[Message, ObjectTree, float], set[str]],
543
546
  Callable[[int], Run],
544
547
  Callable[[str, int], Fab],
545
548
  Callable[[int, str], bytes],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr
3
- Version: 1.24.0
3
+ Version: 1.25.0
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  License: Apache-2.0
6
6
  Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
@@ -180,7 +180,7 @@ Quickstart examples:
180
180
  - [Quickstart (Pandas)](https://github.com/adap/flower/tree/main/examples/quickstart-pandas)
181
181
  - [Quickstart (JAX)](https://github.com/adap/flower/tree/main/examples/quickstart-jax)
182
182
  - [Quickstart (MONAI)](https://github.com/adap/flower/tree/main/examples/quickstart-monai)
183
- - [Quickstart (scikit-learn)](https://github.com/adap/flower/tree/main/examples/sklearn-logreg-mnist)
183
+ - [Quickstart (scikit-learn)](https://github.com/adap/flower/tree/main/examples/quickstart-sklearn)
184
184
  - [Quickstart (Android [TFLite])](https://github.com/adap/flower/tree/main/examples/android)
185
185
  - [Quickstart (iOS [CoreML])](https://github.com/adap/flower/tree/main/examples/ios)
186
186
  - [Quickstart (MLX)](https://github.com/adap/flower/tree/main/examples/quickstart-mlx)
@@ -197,10 +197,8 @@ Other [examples](https://github.com/adap/flower/tree/main/examples):
197
197
  - [Advanced Flower with TensorFlow/Keras](https://github.com/adap/flower/tree/main/examples/advanced-tensorflow)
198
198
  - [Advanced Flower with PyTorch](https://github.com/adap/flower/tree/main/examples/advanced-pytorch)
199
199
  - [Comprehensive Flower+XGBoost](https://github.com/adap/flower/tree/main/examples/xgboost-comprehensive)
200
- - [Flower through Docker Compose and with Grafana dashboard](https://github.com/adap/flower/tree/main/examples/flower-via-docker-compose)
201
200
  - [Flower with KaplanMeierFitter from the lifelines library](https://github.com/adap/flower/tree/main/examples/federated-kaplan-meier-fitter)
202
201
  - [Sample Level Privacy with Opacus](https://github.com/adap/flower/tree/main/examples/opacus)
203
- - [Sample Level Privacy with TensorFlow-Privacy](https://github.com/adap/flower/tree/main/examples/tensorflow-privacy)
204
202
  - [Flower with a Tabular Dataset](https://github.com/adap/flower/tree/main/examples/fl-tabular)
205
203
 
206
204
  ## Community
@@ -7,7 +7,7 @@ flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
7
7
  flwr/cli/app.py,sha256=4qmEhpM5tuc77CNkE7CUPXr8d13S_A6Vau91GUTelGw,3167
8
8
  flwr/cli/app_cmd/__init__.py,sha256=O_vTzS2u-n27fBYnDbjTMMKQQ2Bz80Y4JqGBHSAnK40,856
9
9
  flwr/cli/app_cmd/publish.py,sha256=nnXU3rlh15dZ1Vn0LKZsOZcMvQ6ESN1GGWw9bqRhjBA,9688
10
- flwr/cli/app_cmd/review.py,sha256=eiyKtAkydbs75Puxm0hVBvecV30hNt1toauZSOP_KI0,8504
10
+ flwr/cli/app_cmd/review.py,sha256=Fee5wnCrdFC4OktODyOlUTWAuZCQ3Nn0jcMbu0_BzVw,8828
11
11
  flwr/cli/auth_plugin/__init__.py,sha256=qpebWV9uLpx72_J8yTVgT1DlH2Y9MK_RraDoTYEqv-w,1359
12
12
  flwr/cli/auth_plugin/auth_plugin.py,sha256=H3y8oErskZxp5WdDCkFuj4B7C2ql6NLCqXns7T1YDtw,2994
13
13
  flwr/cli/auth_plugin/noop_auth_plugin.py,sha256=jxCKUKs5yFb3W2p2ZUN9b7k9otVDk56Uzohr3n9Jwek,3242
@@ -19,92 +19,31 @@ flwr/cli/constant.py,sha256=LtxufmhkEqNWQ9doWbbbkUKa12vN_RK_Of5u0So-GHA,1729
19
19
  flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
20
20
  flwr/cli/federation/__init__.py,sha256=Nx1muSlCUZkUCBLFH-nkdx1ku-LtnKsEJ2PmnMwpGn4,836
21
21
  flwr/cli/federation/ls.py,sha256=56Rk81YDfeeAdeca3o5cUmp0a6ntkLNK9f_CRD-4ZtU,4939
22
- flwr/cli/federation/show.py,sha256=qwcubck0YcUpxuTRyAJF2YPVSlMiMJN500Wf3DB-MAk,10002
22
+ flwr/cli/federation/show.py,sha256=431ONxWe4CxmUgPdSkekvQEyruSvnW8b2oKOrEsTG8Y,10087
23
23
  flwr/cli/install.py,sha256=yhgUWd_Psyc18DaoQHEQ5Ji45ZQ-3LclueM9uRxUEPw,10063
24
24
  flwr/cli/log.py,sha256=ZWveENLdDC0Dm10YIMcc3qdGV1aO-2YZXyHBhnB6ofI,7848
25
25
  flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,800
26
26
  flwr/cli/login/login.py,sha256=_nJKmDNVUkWRW6GnzTTNm3BmwCVjSxswtngHQfcDmZ4,4623
27
- flwr/cli/ls.py,sha256=IReCUJLBofsroCSq2kJo2EOkipiOgz81lo1-HlYPjL4,11889
27
+ flwr/cli/ls.py,sha256=KQwQbF45TbhCNtBi9uZaTVuG56xVMSAMCmqN8IuPogU,13510
28
28
  flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
29
- flwr/cli/new/new.py,sha256=Q2fv9aspTeGDKHZt3EwZK7eFqyjBvUNxX-CMRUpwcDU,14619
30
- flwr/cli/new/templates/__init__.py,sha256=FpjWCfIySU2DB4kh0HOXLAjlZNNFDTVU4w3HoE2TzcI,725
31
- flwr/cli/new/templates/app/.gitignore.tpl,sha256=HZJcGQoxp7aUzaPg8Uqch3kNrIESwr9yjimDxJYgXVY,3104
32
- flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
33
- flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=oClo5eR0iLuPzBT7uS3ikhNRAnySz_lhkHFElixKyJM,9640
34
- flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=2-W0HAseLWOe1JJU0TsNocp63D14N7jLwWhtYjxlfxs,3494
35
- flwr/cli/new/templates/app/README.md.tpl,sha256=uI8vUMCEGA1-WJ8-9EUFCnNtofWFkJNOxaR1V6r_Su4,1908
36
- flwr/cli/new/templates/app/__init__.py,sha256=LbR0ksGiF566JcHM_H5m1Tc4-oYUEilWFlcXR-Oe6bI,729
37
- flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
38
- flwr/cli/new/templates/app/code/__init__.py,sha256=zXa2YU1swzHxOKDQbwlDMEwVPOUswVeosjkiXNMTgFo,736
39
- flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=J0Gn74E7khpLyKJVNqOPu7ev93vkcu1PZugsbxtABMw,52
40
- flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl,sha256=mKIS8MK_X8T9NlmcX1-_c9Bbexc-ueqDIBI7uN6c4dE,45
41
- flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=w8xYWhVAb5AFDLj206Nxz5U-xbzDBv0px2FFvE5wRTM,2438
42
- flwr/cli/new/templates/app/code/client.huggingface.py.tpl,sha256=SIZZ3s-6u8IU8cFfsqu6ZU8zjhfI1m1SWauOSUcW8TA,3015
43
- flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=uFCIPwAHYiRAgh2W3nRni_Oig02ZzRF-ofUG5O19zcE,2125
44
- flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=CHU2IBIzI2YENZZuvTsAlSdL94DK19wMYMIhr-JgwZ8,3422
45
- flwr/cli/new/templates/app/code/client.numpy.py.tpl,sha256=1_WEoOPe9jJeK-7FZgYuDUqY8mC0vxgqA83d-h201Gk,1381
46
- flwr/cli/new/templates/app/code/client.pytorch.py.tpl,sha256=fYoh-dTu07LkqNYvwcxQnbgVvH4Yo4eiGEcyHECbsnU,2473
47
- flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl,sha256=fuxVmZpjHIueNy_aHWF81531vmi8DGu4CYjYDqmUwWo,1705
48
- flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=0qqEe-RRjkHGOH8gsD9e83ae-kyyYixhyBgzVHjYpzk,3500
49
- flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=8o55KXpsbF_rv6o98ZNYJDCazjwMp_RPTaSzDfT7Qlw,2682
50
- flwr/cli/new/templates/app/code/client.xgboost.py.tpl,sha256=-ipRV8gqpbEg7Mht77Yyqs1viL-3JYSVZR47I7xeG4c,3493
51
- flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
52
- flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=Xq5fEn5yZkw6HAJi10T_3HRBoqN5_5pNqJHY4wXvD5k,748
53
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=p6BzTbP-mXkFANiVC7iz3YlskOidWaLC341IJyrUotQ,2951
54
- flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=1NA2Sf-EviNtOaYN4dnFk6v2tcZVsY3-eXY84wOXVng,3059
55
- flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=UCLEKUpXarkz9tMFtDrxmLv6QuKe5zCimTuoopQedUM,1717
56
- flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=qe9Om3P2ERvvSj2NN5RSEKgNgztWatCpWtC8SkS_T_M,2420
57
- flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=M6CzBY-gtIqLOu2xTtABXOVgBnqKOu7d6Vn2sazmYuI,2444
58
- flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=P6jTuN9reJfdthiN3mOUHiA4xrtDh5TTUcAV6210-hU,2104
59
- flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=hliBSfHSzg4bi6PxMlj4oGFfvzvi-4DzoaI67VZbJeQ,1111
60
- flwr/cli/new/templates/app/code/server.huggingface.py.tpl,sha256=_2Mv-SqGSMf7sMdbMEmvROzedvNaVHvhIIO3eYAhVYU,1252
61
- flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=RW-rh7ogcJ3_BD66bJxTw-ZoP7c-4SK8hVHc-e0SSVY,1029
62
- flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=J8rIe6RL2ndODVJD79xShRKBH70HljFSCi4s_RJ-xLQ,1200
63
- flwr/cli/new/templates/app/code/server.numpy.py.tpl,sha256=T3hcKbPw3uL5lXEP-MuVJXIBXjzva5sWJXfpQqarUwA,955
64
- flwr/cli/new/templates/app/code/server.pytorch.py.tpl,sha256=epARqfcQ-EQsdZwaaaUp5y4OSTBT6CiFGlNRocw-23A,1158
65
- flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl,sha256=gvBsGA_Jg9kAH8xTxjzTjMcvBtciuccOwQFbO7ey8tU,916
66
- flwr/cli/new/templates/app/code/server.sklearn.py.tpl,sha256=ehQ5VRgBn92WeFl6kupwJnuxSNkKvE-EvKde6A9mNQo,1377
67
- flwr/cli/new/templates/app/code/server.tensorflow.py.tpl,sha256=2-WTOPd-ewdLd9QmSlflIH7ix7zxAzPEOZoyiPBOy8c,1010
68
- flwr/cli/new/templates/app/code/server.xgboost.py.tpl,sha256=fwtCRyCG2hDSH1zVMyZv7zA7wsdKNPfpugDSZjxCs5Q,1746
69
- flwr/cli/new/templates/app/code/strategy.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
70
- flwr/cli/new/templates/app/code/task.huggingface.py.tpl,sha256=piBbY3Dg60bQnCg15uzMw0QiL5SDOYX4YhQouy-X2zI,3164
71
- flwr/cli/new/templates/app/code/task.jax.py.tpl,sha256=Fb0XgdTAQplM-ZCusI081XA9asO3gHptH772S-Xcyy8,1525
72
- flwr/cli/new/templates/app/code/task.mlx.py.tpl,sha256=YxH5z4s5kOh5_9DIY9pvzqURckLDfgdanTA68_iM_Wo,2946
73
- flwr/cli/new/templates/app/code/task.numpy.py.tpl,sha256=CwUJPnN3z6GjP8-KVGWzx7RYRJsl0wLFZ72xscvl3RM,126
74
- flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=Mc-O7kLdBYSz4dLtrJGFh8_Is5agq7hMfHH8G5So9fM,3461
75
- flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl,sha256=XlJqA4Ix_PloO_zJLhjiN5vDj16w3I4CPVGdmbe8asE,3800
76
- flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=vHdhtMp0FHxbYafXyhDT9aKmmmA0Jvpx5Oum1Yu9lWY,1850
77
- flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=impgWN7MfztmcWF4xh1llcZGsgTvrb1HD5ZE0t-8U08,1731
78
- flwr/cli/new/templates/app/code/task.xgboost.py.tpl,sha256=0xO8jQvrHuB1llVDopQPOmt5Hn6rBw8umzoNwiZZs-o,2135
79
- flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
80
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=yj8Hwa6TCk_p4LzGLICfan0kr9XY84GUAYKsnBrp9po,3182
81
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=I1kerPViFarJCJy9bMJ8iUzyjjyN8YuCr4NKIOQOOlU,2501
82
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=sp1cCcsZMyPPfM_2TOCHdnEUSEEVMIyDJIUp3u9Y5HI,2020
83
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Q96m1Taa1G1yvQAmc0JXqo1zBxK6ZbyTlChxUSjJN_0,1471
84
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=LSO9_NWq-awCnDlRc2p-q82QqJtGUETHDOt_yF7mvSM,1542
85
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=W0S-ICbndTu5WpvuPQPH4ipR4va76Acv9sRz7P460C8,1409
86
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=MsoW2HVqVcdfa7hGahnV87Ee198GsxB48_b6WGXkP4E,1490
87
- flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl,sha256=WID8ekdB7wlPYryrlcCPM0xw2kzubwqFc6_yiIeoY74,1508
88
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=8yQeX0yvLLpqjm6TOksrL9JmqaZE3WWs7nJrlO7Ssas,1484
89
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=0EOfQ24SXAiWd-z-1r3Ad9vscCrjKfe5-tgev55XURs,1500
90
- flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl,sha256=YwgeVboJ8Q9xqCoEa-fUa8-rWZltBe0u_KyfEzn8n-c,1661
29
+ flwr/cli/new/new.py,sha256=VKrwkpd_voU4YwCVPIBPeFZjZiLW9OGpMPX_tpvPAE0,8315
91
30
  flwr/cli/pull.py,sha256=WRQOVxovWNX0kRnjUwCyFwyVmAEQY54EpQKFGEGUVUk,3530
92
31
  flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
93
- flwr/cli/run/run.py,sha256=mL97D-4EbRlqVdB83oUPYyj_ZSiQuJ1k7zy8jQGLkQA,10018
94
- flwr/cli/run_utils.py,sha256=m1qgQdUZptL3ejIOHI0RF_-_3PxhiebEQh1DkG60xl4,4164
95
- flwr/cli/stop.py,sha256=g5Tnkf-Xl0VYafvALtI7Zl4kRSc9Vg4DckaWj4sXsjE,5477
32
+ flwr/cli/run/run.py,sha256=-o2Um7G5QSrPJ0kc2_36ANMuSc-e6k5UvmSBfJTQxFs,9983
33
+ flwr/cli/run_utils.py,sha256=fCP66XdL5gWZPE2B-Nb5kbEI9slmPLFe3x6fbmD0kkw,5079
34
+ flwr/cli/stop.py,sha256=5k1G_yU-gSmqF2h3VpxpFgQM3PpUWnNRT-8ioFBRtNU,5482
96
35
  flwr/cli/supernode/__init__.py,sha256=DBkjoPo2hS2Y-ghJxwLbrAbCQFBgD82_Itl2_892UBo,917
97
- flwr/cli/supernode/ls.py,sha256=8wxiwizKq_xXsDk2be6zYpeN-Giz6rO02s4l2y41R0k,8834
36
+ flwr/cli/supernode/ls.py,sha256=8xcidpuUWw48ommYzOR_7MMdI989pI9nRSbzIXhOGXE,8955
98
37
  flwr/cli/supernode/register.py,sha256=2aQTT2wEp2pxxuIacC6FQkN8q_QKifZhWjD7LNw1R2A,6527
99
38
  flwr/cli/supernode/unregister.py,sha256=PXugcJJrM7cP3HbULjgcO22DciDP2uWN7YNgce4hv5E,4632
100
- flwr/cli/utils.py,sha256=OREEBMdKL2xWolhePtp_z_aQ7n5tHKQH9vr55XLv56E,24527
39
+ flwr/cli/utils.py,sha256=GWlonSmHUdezWf-7UTX4QmlWH7686R3SDQqiovYfomI,20528
101
40
  flwr/client/__init__.py,sha256=xwkPJfdeWxIIfmiPE5vnmnY_JbTlErP0Qs9eBP6qRFg,1252
102
41
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
103
42
  flwr/client/dpfedavg_numpy_client.py,sha256=ELDHyEJcTB-FlLhHC-JXy8HuB3ZFHfT0HL3g1VSWY5w,7451
104
43
  flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
105
- flwr/client/grpc_adapter_client/connection.py,sha256=2EqYS2srRVFWRKcLVjM4nnSnEglbXb_SrY8HOrIvhY4,4228
44
+ flwr/client/grpc_adapter_client/connection.py,sha256=rr3NA7d-BYsWNTu1VRE9966FxToLLECLBAVNhf5uFoo,4242
106
45
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
107
- flwr/client/grpc_rere_client/connection.py,sha256=3iaO4ouFt3H-ql2GyqoMqVa-wHMtjejIv6vDoeIYMeo,13711
46
+ flwr/client/grpc_rere_client/connection.py,sha256=_DbWVlt6Y_vc9xGCfimnIE7Bvckwph21RENgKVHHjUM,13821
108
47
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=NlYVdKSyZ2hrKdYgIsz3-kmMaQI3Nj2fe3gXeTMyZjM,7565
109
48
  flwr/client/grpc_rere_client/node_auth_client_interceptor.py,sha256=rIUo64KOSYMC-GlfTvIYgeouAX8i6eOd5Rq2Yi9UFMY,2437
110
49
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
@@ -119,7 +58,7 @@ flwr/client/mod/secure_aggregation/secaggplus_mod.py,sha256=8dK3v58tZztbdxzWW6VC
119
58
  flwr/client/mod/utils.py,sha256=FUgD2TfcWqSeF6jUKZ4i6Ke56U4Nrv85AeVb93s6R9g,1201
120
59
  flwr/client/numpy_client.py,sha256=0RqxyVRAo_6oc8eZqSPC10chJk8hjz-8aUpgxCre950,9590
121
60
  flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
122
- flwr/client/rest_client/connection.py,sha256=BNMS0DU2sl5M1651Nh-re1iiuR4hDvIetd2s-cOyETM,17416
61
+ flwr/client/rest_client/connection.py,sha256=cr45qNcSU5fsehYbqXpwDHiZkPdxR9SWhRoENV0bwwE,17525
123
62
  flwr/client/run_info_store.py,sha256=3lINm9f7f6tgZJ3Dx-e9E9DrVhrrjXNYii0RnBDS79w,4002
124
63
  flwr/client/typing.py,sha256=SfM-8BWSQww_PSU-B1ScRDDWCyjgI0QF8WGRpfPBUYs,1057
125
64
  flwr/clientapp/__init__.py,sha256=dsXH29kvCk1meJj9UYMCIak8zehuuhVp0uDJ2COU_1c,829
@@ -174,10 +113,10 @@ flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=Of0Y3A_pG5jzO4WUH_8
174
113
  flwr/common/secure_aggregation/quantization.py,sha256=ssFZpiRyj9ltIh0Ai3vGkDqWFO4SoqgoD1mDU9XqMEM,2400
175
114
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=dGYhWOBMMDJcQH4_tQNC8-Efqm-ecEUNN9ANz59UnCk,2182
176
115
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=E_xU-Zd45daO1em7M6C2wOjFXVtJf-6tl7fp-7xq1wo,3214
177
- flwr/common/serde.py,sha256=b3myxiIvKtpsuvBYoiNa5ywFFfKgL5ESNVehRiEl_yk,22059
116
+ flwr/common/serde.py,sha256=THx4cyTkooT2Rsx0po2tnXkihMheKfcSiXe3AMhVt_0,22315
178
117
  flwr/common/serde_utils.py,sha256=Vk49PnZWRgo0NrvBhFqH-Li7sMFVVgyrs3Ck7kHB-ZE,5820
179
118
  flwr/common/telemetry.py,sha256=H05fpO7nOvvb2FSGOsGIIwMbBaQo59FBgwqk0YafW9M,8921
180
- flwr/common/typing.py,sha256=MX0vtznZfRRU0FPQQtbS_xkzaUbOhK2kD9pbDMAcNIs,7178
119
+ flwr/common/typing.py,sha256=OUSnJHUd2D1N04FPNFg-s8AUON55sIjOSkd2VH7e044,7334
181
120
  flwr/common/version.py,sha256=7GAGzPn73Mkh09qhrjbmjZQtcqVhBuzhFBaK4Mk4VRk,1325
182
121
  flwr/compat/__init__.py,sha256=gbfDQKKKMZzi3GswyVRgyLdDlHiWj3wU6dg7y6m5O_s,752
183
122
  flwr/compat/client/__init__.py,sha256=qpbo0lcxdNL4qy5KHqiGm8OLxSxkYgI_-dLh5rwhtcI,746
@@ -213,8 +152,8 @@ flwr/proto/federation_pb2.py,sha256=x8hwIFsw87e7STmvq5qL90RmcImCGw5oOqbke7xaykA,
213
152
  flwr/proto/federation_pb2.pyi,sha256=_At18SzwJjlf3k3FXjVi3Op59rs2i5XcIeBSPlvfXr0,2215
214
153
  flwr/proto/federation_pb2_grpc.py,sha256=HPErt9uXJPbY8jLtTNFr941z82uMm7cOx10hTHgcwZM,902
215
154
  flwr/proto/federation_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
216
- flwr/proto/fleet_pb2.py,sha256=5uzFvGiLkuR2VMuT6QKR4lxRC7K27G09wTbwxchbsYU,6486
217
- flwr/proto/fleet_pb2.pyi,sha256=5_yam3FKsjqMgYKbRWxAZhlEk6SsslOh5TBiLisn8Mk,10163
155
+ flwr/proto/fleet_pb2.py,sha256=HnxtM2pqVdn2xhl3e1NlLazpSMaGoUUEG9Nd17egxqU,6543
156
+ flwr/proto/fleet_pb2.pyi,sha256=MOuD26tWyNu2InVza-xHJD57ctthha1qKZyGYaxTUTY,10497
218
157
  flwr/proto/fleet_pb2_grpc.py,sha256=oR-Tw12sQiAQ_jhqGsGASPG6jdMg0Rgwb7_z_NknOOk,23702
219
158
  flwr/proto/fleet_pb2_grpc.pyi,sha256=k3C0pxqvparcfrFoCWkb0gVhVeDLh4y8dH2zUa7GbQE,10227
220
159
  flwr/proto/grpcadapter_pb2.py,sha256=sPB1FbcNIjw5plvQqhd_vynO0-59n9U7G882l6o1z6Y,2101
@@ -241,8 +180,8 @@ flwr/proto/recorddict_pb2.py,sha256=L2mNSyIVWA2dcI1xWI3gj0nktuDHYgxbbLuVRQKVU74,
241
180
  flwr/proto/recorddict_pb2.pyi,sha256=BYgVNk985Ww4dCXCjDGg1YU6q7MuMqbDa0usGVH3ktg,15208
242
181
  flwr/proto/recorddict_pb2_grpc.py,sha256=kw9_kXNcRe3y6j6HquG1P1MqccFFAogfi48djxbOLDE,902
243
182
  flwr/proto/recorddict_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
244
- flwr/proto/run_pb2.py,sha256=k7sHGZl1Z8C1IQ7paVHYWR_T3pEhFwf2RR6VBVbD6-M,4970
245
- flwr/proto/run_pb2.pyi,sha256=w0f2rg3EA0XsQEvMMA25gH8rKJbVunlgSeC1DewbUmQ,10393
183
+ flwr/proto/run_pb2.py,sha256=8tQDMyiBjw_-S6jiJpFd_-dDrMq9ZhyPyWwnmFu3qek,5101
184
+ flwr/proto/run_pb2.pyi,sha256=t42qPzJTY1GVUUrkdIjdoPfAKlsXlUw9A8vBpwgbHsI,10852
246
185
  flwr/proto/run_pb2_grpc.py,sha256=l5u1Ww6JxVLVN784Z2OQbkQ-tAf5yYGh6QbNDc4F5II,895
247
186
  flwr/proto/run_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
248
187
  flwr/proto/serverappio_pb2.py,sha256=fqZA5baD7lerWBn1Pb9PWhXlDvsb8pLOJ99DV4cYh-4,4045
@@ -259,7 +198,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=jYsbV3KYdp4TaNfWxv3ljFEvB-Yjsa8MIPtTH-vV
259
198
  flwr/proto/transport_pb2_grpc.pyi,sha256=qd2cOXq6HBZtwRfPpKuni27NGMJCAxyP5R95Vk8WWDU,2073
260
199
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
261
200
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
262
- flwr/server/app.py,sha256=4jU7qSA-Oa1miBZuFK08-5fMGbi2KofybAnts4kTrzI,31777
201
+ flwr/server/app.py,sha256=rncuCdcyied2JNqQQaV1QOGTGEWRH2ZuZV0GCLvzNnQ,31821
263
202
  flwr/server/client_manager.py,sha256=3WOqNWh5dlqPRG-DMGwXiyvGNEYS_jKqXKkFIkMqWLQ,6187
264
203
  flwr/server/client_proxy.py,sha256=QS_RGgjSZ8V4StAHH8zc7W9_os2FyO4wNqkbylQMBTY,2341
265
204
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -318,7 +257,7 @@ flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt
318
257
  flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=DtHuDP7fvgO-iamI48ACr0TQcD20eBYwMicHKIjhmXQ,12583
319
258
  flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py,sha256=h3pPs--wdiomaCuGOg5fr3wwYVfwi-PK-tVArrr_bg8,5669
320
259
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
321
- flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=XZSrjTB_7J_dL5PEPjQ9T2abxTJJZ_aBlPE-tUHGrVc,10703
260
+ flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=9K88lwHADwq7o9XqzG3PPVzVz3cTUTBrQC8R6IVN1Rc,12165
322
261
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
323
262
  flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=cDWDQBf79F9tZ1mXOErc-nsnY4zFP9Tcv7Fs-bQIdiU,9616
324
263
  flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
@@ -327,10 +266,10 @@ flwr/server/superlink/fleet/vce/backend/backend.py,sha256=HPOXhT40bFwCA9pz8w2sAT
327
266
  flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=LhVmM2Mi6kOskOyDFnbIb7AH304J0eUU1r2B32bzUFc,7193
328
267
  flwr/server/superlink/fleet/vce/vce_api.py,sha256=A62Vx3r71bNI-v10IUen_27fDJoYXsOyvBM3JrkTvho,13609
329
268
  flwr/server/superlink/linkstate/__init__.py,sha256=OtsgvDTnZLU3k0sUbkHbqoVwW6ql2FDmb6uT6DbNkZo,1064
330
- flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=tPpet43VBXOeHK0VUXeNXEM7CtQ6lDSja5PG9PGb17M,30649
331
- flwr/server/superlink/linkstate/linkstate.py,sha256=NfPD0_IElqxq9c3DuEzMFxdIERMocupSwY_aYI5mGeg,16079
269
+ flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=QHpm9Or8LH-c8xMRSk19MnsYHtvd8Lk2mEo08bMMCAY,32030
270
+ flwr/server/superlink/linkstate/linkstate.py,sha256=9Mnk3kRZ70CuzGktFlm3dwnOanNuXY95mK9q-cgclWY,17304
332
271
  flwr/server/superlink/linkstate/linkstate_factory.py,sha256=dtn3xvp4uGek_vtbHyLnn0OZNOcQn6_dpNNX-r8lwAc,2866
333
- flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=4j4rM7lA6FGFUMlhRGT_OKDPEQDZITjj9uAuxYeDsZQ,48816
272
+ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=IAjMHcXi24n7gtFF-qwUHBqnwgXIxmPlPtL0Wl2ANy8,51143
334
273
  flwr/server/superlink/linkstate/utils.py,sha256=ZKaunvXhzb4eqxy91zH3xlF22cpNimeRzTJCNdoZ57s,14019
335
274
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
336
275
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=2NFPynJMpYpT9C98Fr4n0QrTTjWBWbeUzlHcc6pg2kY,2279
@@ -385,7 +324,7 @@ flwr/supercore/__init__.py,sha256=pqkFoow_E6UhbBlhmoD1gmTH-33yJRhBsIZqxRPFZ7U,75
385
324
  flwr/supercore/app_utils.py,sha256=K76Zt6R670b1hUmxOsNc1WUCVYvF7lejXPcCO9K0Q0g,1753
386
325
  flwr/supercore/cli/__init__.py,sha256=EDl2aO-fuQfxSbL-T1W9RAfA2N0hpWHmqX_GSwblJbQ,845
387
326
  flwr/supercore/cli/flower_superexec.py,sha256=IQIGzxgaeLNMNzGXGemfYK3lp8God5bTkXpVkbeP_ig,6109
388
- flwr/supercore/constant.py,sha256=me9ymgv1FoccFQpsQcQBECHv8A5Gdf_bnx8rtJQ_o5s,2201
327
+ flwr/supercore/constant.py,sha256=88dDhPgi8ZjBBgiEUsCWtCzEV5yREc_9Dlja2UeHV_8,2286
389
328
  flwr/supercore/corestate/__init__.py,sha256=Vau6-L_JG5QzNqtCTa9xCKGGljc09wY8avZmIjSJemg,774
390
329
  flwr/supercore/corestate/corestate.py,sha256=EZg4gPXqVOXwS7t0tlPfedajoWj5T80oeDBNxpV2y2I,2874
391
330
  flwr/supercore/corestate/in_memory_corestate.py,sha256=9qa6RuRZfCp6vs-ARYdiZjCL31VOAAxw0a_VkBXR5zY,5116
@@ -417,7 +356,7 @@ flwr/supercore/superexec/plugin/exec_plugin.py,sha256=iRRZcnTcM3wMwkkUElmfFka31a
417
356
  flwr/supercore/superexec/plugin/serverapp_exec_plugin.py,sha256=IwRzdPV-cSKwrP2krGh0De4IkAuxsmgK0WU6J-2GXqM,1035
418
357
  flwr/supercore/superexec/plugin/simulation_exec_plugin.py,sha256=upn5zE-YKkl_jTw8RzmeyQ58PU_UAlQ7CqnBXXdng8I,1060
419
358
  flwr/supercore/superexec/run_superexec.py,sha256=yeV6_eI0XFfPyNwnlgqchR9jI80FzSI80oyekrIlO2M,7144
420
- flwr/supercore/utils.py,sha256=KOvqGhRZ1if9AEg_eb0klwp7_smXkTwwGhAUpeGORWA,1841
359
+ flwr/supercore/utils.py,sha256=AKspWRUwaFE84JHP7_GkqJCB1uOWt9QL0K2GAQZf0Yo,7412
421
360
  flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
422
361
  flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBIpVy_HxQOmne4PAs,810
423
362
  flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gt1UUojVOa4WDgv8unU20MoETSMd5rSPF9eIITBNJY0,1236
@@ -431,24 +370,24 @@ flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfh
431
370
  flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
432
371
  flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=AJs7GE-fyUBLcUEUzB058TpFzC7gyDOL17THvYkJTn8,6529
433
372
  flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=r9LjF5VkrE1sZIcml-sO2uOPAwpvr6dj4tFchqoDcR4,5965
434
- flwr/superlink/servicer/control/control_grpc.py,sha256=Hkkse7BAZ6dHJTfc1bO_zQI3Qd67fQMO0-bjf4fs6X0,4140
373
+ flwr/superlink/servicer/control/control_grpc.py,sha256=AD7q2eo7RvXEhntcfVLgoKAR7AWfD_Z56Qw51wGLanY,4218
435
374
  flwr/superlink/servicer/control/control_license_interceptor.py,sha256=8d28soJ0mLLhpSGCpuY2YzgbX0vVO7Sqe2DcApEgILc,3336
436
- flwr/superlink/servicer/control/control_servicer.py,sha256=YRceYBgxIhLvvSK7QriFCVHMgl61pdxXWTa-GA4dVnM,22773
375
+ flwr/superlink/servicer/control/control_servicer.py,sha256=xfS8c0fxH8n3TW4uVp4nFLfTJD7KJtorOwdzS7Svzp8,25376
437
376
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
438
377
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
439
378
  flwr/supernode/cli/flower_supernode.py,sha256=1HdhlGaVo51_7w3AL1hE5zfIVJMow0Ngi_F3Js01djs,10815
440
379
  flwr/supernode/cli/flwr_clientapp.py,sha256=W3tAyqSfeHbPhqBC4Pfo9bsyFdkBKPqdKlhGmeUKwKg,3173
441
380
  flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
442
- flwr/supernode/nodestate/in_memory_nodestate.py,sha256=_SDshB4JebO5pWScdrkF4xdxw1kMH_BH9scvyg385_M,7987
443
- flwr/supernode/nodestate/nodestate.py,sha256=NwnORCF3xBpIf996tq2h9v4vtVpJZsIHkXxUc2NnGzs,4998
381
+ flwr/supernode/nodestate/in_memory_nodestate.py,sha256=DBhpDsPmitkOr86pW78_0aiG_jWgjjCXerFONXsyOSE,10578
382
+ flwr/supernode/nodestate/nodestate.py,sha256=RWrsHS1nndK67-T6YSmi85qRb_t_wM7fjLb16YS-87Y,6217
444
383
  flwr/supernode/nodestate/nodestate_factory.py,sha256=i-1cv42R9LBM1nyasTHuTHSqlyJxVSRtUK2BMzqT-Ss,1631
445
384
  flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
446
385
  flwr/supernode/runtime/run_clientapp.py,sha256=-JsN3h7jQC12vzDBmImzYmyccI3LveIu-Z7eE-QNF-Y,9461
447
386
  flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca8gxdEo,717
448
387
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
449
- flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=beWxBHsOKyDRwSldSYac5ZF7oueCrZXC2j_qve3-tQ4,11327
450
- flwr/supernode/start_client_internal.py,sha256=kY_i6JJlD8VzuGtk4AzfM5La-3GQg4lpyuwQUh1pFCM,25930
451
- flwr-1.24.0.dist-info/METADATA,sha256=vvDO-VQc7CUw_ObmirfE5wxVIA3LNtz_fjB3L1DzhNg,14593
452
- flwr-1.24.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
453
- flwr-1.24.0.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
454
- flwr-1.24.0.dist-info/RECORD,,
388
+ flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=jBSg83_LhxQmoB1-SsgwpVf7eq_VZBRi4Q2ccYYbmdw,11637
389
+ flwr/supernode/start_client_internal.py,sha256=wTSde-BO9Y19CuI4k4aeZ7ichF5rttfrGc-uJ-dgEBQ,26135
390
+ flwr-1.25.0.dist-info/METADATA,sha256=S4oKSngNKgw05po43jhlisP6rGlO2ozS5_NnDFClMII,14334
391
+ flwr-1.25.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
392
+ flwr-1.25.0.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
393
+ flwr-1.25.0.dist-info/RECORD,,
@@ -1,15 +0,0 @@
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 CLI `new` command templates."""