flwr-nightly 1.19.0.dev20250601__py3-none-any.whl → 1.19.0.dev20250603__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 (31) hide show
  1. flwr/client/clientapp/__init__.py +0 -7
  2. flwr/client/grpc_rere_client/connection.py +9 -18
  3. flwr/common/inflatable.py +8 -2
  4. flwr/common/inflatable_grpc_utils.py +9 -5
  5. flwr/common/record/configrecord.py +9 -8
  6. flwr/common/record/metricrecord.py +6 -5
  7. flwr/common/retry_invoker.py +5 -1
  8. flwr/common/serde.py +39 -28
  9. flwr/common/serde_utils.py +2 -0
  10. flwr/proto/message_pb2.py +8 -8
  11. flwr/proto/message_pb2.pyi +20 -3
  12. flwr/proto/recorddict_pb2.py +16 -28
  13. flwr/proto/recorddict_pb2.pyi +46 -64
  14. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +62 -5
  15. flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -2
  16. flwr/server/superlink/serverappio/serverappio_servicer.py +58 -3
  17. flwr/supernode/cli/__init__.py +5 -1
  18. flwr/supernode/cli/flower_supernode.py +1 -2
  19. flwr/supernode/cli/flwr_clientapp.py +73 -0
  20. flwr/supernode/nodestate/in_memory_nodestate.py +112 -0
  21. flwr/supernode/nodestate/nodestate.py +132 -6
  22. flwr/supernode/runtime/__init__.py +15 -0
  23. flwr/{client/clientapp/app.py → supernode/runtime/run_clientapp.py} +2 -54
  24. flwr/supernode/servicer/__init__.py +15 -0
  25. flwr/supernode/servicer/clientappio/__init__.py +24 -0
  26. flwr/supernode/start_client_internal.py +24 -20
  27. {flwr_nightly-1.19.0.dev20250601.dist-info → flwr_nightly-1.19.0.dev20250603.dist-info}/METADATA +1 -1
  28. {flwr_nightly-1.19.0.dev20250601.dist-info → flwr_nightly-1.19.0.dev20250603.dist-info}/RECORD +31 -27
  29. {flwr_nightly-1.19.0.dev20250601.dist-info → flwr_nightly-1.19.0.dev20250603.dist-info}/entry_points.txt +1 -1
  30. /flwr/{client/clientapp → supernode/servicer/clientappio}/clientappio_servicer.py +0 -0
  31. {flwr_nightly-1.19.0.dev20250601.dist-info → flwr_nightly-1.19.0.dev20250603.dist-info}/WHEEL +0 -0
@@ -15,17 +15,143 @@
15
15
  """Abstract base class NodeState."""
16
16
 
17
17
 
18
- import abc
18
+ from abc import ABC, abstractmethod
19
+ from collections.abc import Sequence
19
20
  from typing import Optional
20
21
 
22
+ from flwr.common import Context, Message
23
+ from flwr.common.typing import Run
21
24
 
22
- class NodeState(abc.ABC):
23
- """Abstract NodeState."""
24
25
 
25
- @abc.abstractmethod
26
- def set_node_id(self, node_id: Optional[int]) -> None:
26
+ class NodeState(ABC):
27
+ """Abstract base class for node state."""
28
+
29
+ @abstractmethod
30
+ def set_node_id(self, node_id: int) -> None:
27
31
  """Set the node ID."""
28
32
 
29
- @abc.abstractmethod
33
+ @abstractmethod
30
34
  def get_node_id(self) -> int:
31
35
  """Get the node ID."""
36
+
37
+ @abstractmethod
38
+ def store_message(self, message: Message) -> Optional[str]:
39
+ """Store a message.
40
+
41
+ Parameters
42
+ ----------
43
+ message : Message
44
+ The message to store.
45
+
46
+ Returns
47
+ -------
48
+ Optional[str]
49
+ The object ID of the stored message, or None if storage failed.
50
+ """
51
+
52
+ @abstractmethod
53
+ def get_messages(
54
+ self,
55
+ *,
56
+ run_ids: Optional[Sequence[int]] = None,
57
+ is_reply: Optional[bool] = None,
58
+ limit: Optional[int] = None,
59
+ ) -> Sequence[Message]:
60
+ """Retrieve messages based on the specified filters.
61
+
62
+ If a filter is set to None, it is ignored.
63
+ If multiple filters are provided, they are combined using AND logic.
64
+
65
+ Parameters
66
+ ----------
67
+ run_ids : Optional[Sequence[int]] (default: None)
68
+ Sequence of run IDs to filter by. If a sequence is provided,
69
+ it is treated as an OR condition.
70
+ is_reply : Optional[bool] (default: None)
71
+ If True, filter for reply messages; if False, filter for non-reply
72
+ (instruction) messages.
73
+ limit : Optional[int] (default: None)
74
+ Maximum number of messages to return. If None, no limit is applied.
75
+
76
+ Returns
77
+ -------
78
+ Sequence[Message]
79
+ A sequence of messages matching the specified filters.
80
+
81
+ Notes
82
+ -----
83
+ **IMPORTANT:** Retrieved messages will **NOT** be returned again by subsequent
84
+ calls to this method, even if the filters match them.
85
+ """
86
+
87
+ @abstractmethod
88
+ def delete_messages(
89
+ self,
90
+ *,
91
+ message_ids: Optional[Sequence[str]] = None,
92
+ ) -> None:
93
+ """Delete messages based on the specified filters.
94
+
95
+ If a filter is set to None, it is ignored.
96
+ If multiple filters are provided, they are combined using AND logic.
97
+
98
+ Parameters
99
+ ----------
100
+ message_ids : Optional[Sequence[str]] (default: None)
101
+ Sequence of message (object) IDs to filter by. If a sequence is provided,
102
+ it is treated as an OR condition.
103
+
104
+ Notes
105
+ -----
106
+ **IMPORTANT:** **All messages** will be deleted if no filters are provided.
107
+ """
108
+
109
+ @abstractmethod
110
+ def store_run(self, run: Run) -> None:
111
+ """Store a run.
112
+
113
+ Parameters
114
+ ----------
115
+ run : Run
116
+ The `Run` instance to store.
117
+ """
118
+
119
+ @abstractmethod
120
+ def get_run(self, run_id: int) -> Optional[Run]:
121
+ """Retrieve a run by its ID.
122
+
123
+ Parameters
124
+ ----------
125
+ run_id : int
126
+ The ID of the run to retrieve.
127
+
128
+ Returns
129
+ -------
130
+ Optional[Run]
131
+ The `Run` instance if found, otherwise None.
132
+ """
133
+
134
+ @abstractmethod
135
+ def store_context(self, context: Context) -> None:
136
+ """Store a context.
137
+
138
+ Parameters
139
+ ----------
140
+ context : Context
141
+ The context to store.
142
+ """
143
+
144
+ @abstractmethod
145
+ def get_context(self, run_id: int) -> Optional[Context]:
146
+ """Retrieve a context by its run ID.
147
+
148
+ Parameters
149
+ ----------
150
+ run_id : int
151
+ The ID of the run with which the context is associated.
152
+
153
+ Returns
154
+ -------
155
+ Optional[Context]
156
+ The `Context` instance if found, otherwise None.
157
+ """
@@ -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
+ """Flower SuperNode components."""
@@ -15,7 +15,6 @@
15
15
  """Flower ClientApp process."""
16
16
 
17
17
 
18
- import argparse
19
18
  import gc
20
19
  import time
21
20
  from logging import DEBUG, ERROR, INFO
@@ -26,11 +25,10 @@ import grpc
26
25
  from flwr.app.error import Error
27
26
  from flwr.cli.install import install_from_fab
28
27
  from flwr.client.client_app import ClientApp, LoadClientAppError
28
+ from flwr.client.clientapp.utils import get_load_client_app_fn
29
29
  from flwr.common import Context, Message
30
- from flwr.common.args import add_args_flwr_app_common
31
30
  from flwr.common.config import get_flwr_dir
32
- from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
33
- from flwr.common.exit import ExitCode, flwr_exit
31
+ from flwr.common.constant import ErrorCode
34
32
  from flwr.common.grpc import create_channel, on_channel_state_change
35
33
  from flwr.common.logger import log
36
34
  from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
@@ -55,34 +53,6 @@ from flwr.proto.clientappio_pb2 import (
55
53
  )
56
54
  from flwr.proto.clientappio_pb2_grpc import ClientAppIoStub
57
55
 
58
- from .utils import get_load_client_app_fn
59
-
60
-
61
- def flwr_clientapp() -> None:
62
- """Run process-isolated Flower ClientApp."""
63
- args = _parse_args_run_flwr_clientapp().parse_args()
64
- if not args.insecure:
65
- flwr_exit(
66
- ExitCode.COMMON_TLS_NOT_SUPPORTED,
67
- "flwr-clientapp does not support TLS yet.",
68
- )
69
-
70
- log(INFO, "Start `flwr-clientapp` process")
71
- log(
72
- DEBUG,
73
- "`flwr-clientapp` will attempt to connect to SuperNode's "
74
- "ClientAppIo API at %s with token %s",
75
- args.clientappio_api_address,
76
- args.token,
77
- )
78
- run_clientapp(
79
- clientappio_api_address=args.clientappio_api_address,
80
- run_once=(args.token is not None),
81
- token=args.token,
82
- flwr_dir=args.flwr_dir,
83
- certificates=None,
84
- )
85
-
86
56
 
87
57
  def run_clientapp( # pylint: disable=R0914
88
58
  clientappio_api_address: str,
@@ -233,25 +203,3 @@ def push_clientappoutputs(
233
203
  except grpc.RpcError as e:
234
204
  log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
235
205
  raise e
236
-
237
-
238
- def _parse_args_run_flwr_clientapp() -> argparse.ArgumentParser:
239
- """Parse flwr-clientapp command line arguments."""
240
- parser = argparse.ArgumentParser(
241
- description="Run a Flower ClientApp",
242
- )
243
- parser.add_argument(
244
- "--clientappio-api-address",
245
- default=CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS,
246
- type=str,
247
- help="Address of SuperNode's ClientAppIo API (IPv4, IPv6, or a domain name)."
248
- f"By default, it is set to {CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS}.",
249
- )
250
- parser.add_argument(
251
- "--token",
252
- type=int,
253
- required=False,
254
- help="Unique token generated by SuperNode for each ClientApp execution",
255
- )
256
- add_args_flwr_app_common(parser=parser)
257
- return parser
@@ -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
+ """Flower SuperNode servicers."""
@@ -0,0 +1,24 @@
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
+ """ClientAppIo API Servicer."""
16
+
17
+
18
+ from .clientappio_servicer import ClientAppInputs, ClientAppIoServicer, ClientAppOutputs
19
+
20
+ __all__ = [
21
+ "ClientAppInputs",
22
+ "ClientAppIoServicer",
23
+ "ClientAppOutputs",
24
+ ]
@@ -17,7 +17,6 @@
17
17
 
18
18
  import multiprocessing
19
19
  import os
20
- import sys
21
20
  import threading
22
21
  import time
23
22
  from collections.abc import Iterator
@@ -33,11 +32,6 @@ from grpc import RpcError
33
32
 
34
33
  from flwr.app.error import Error
35
34
  from flwr.cli.config_utils import get_fab_metadata
36
- from flwr.client.clientapp.app import flwr_clientapp
37
- from flwr.client.clientapp.clientappio_servicer import (
38
- ClientAppInputs,
39
- ClientAppIoServicer,
40
- )
41
35
  from flwr.client.grpc_adapter_client.connection import grpc_adapter
42
36
  from flwr.client.grpc_rere_client.connection import grpc_request_response
43
37
  from flwr.client.run_info_store import DeprecatedRunInfoStore
@@ -63,6 +57,8 @@ from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
63
57
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
64
58
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
65
59
  from flwr.supernode.nodestate import NodeStateFactory
60
+ from flwr.supernode.runtime.run_clientapp import run_clientapp
61
+ from flwr.supernode.servicer.clientappio import ClientAppInputs, ClientAppIoServicer
66
62
 
67
63
 
68
64
  # pylint: disable=import-outside-toplevel
@@ -262,18 +258,14 @@ def start_client_internal(
262
258
  else clientappio_api_address
263
259
  )
264
260
  # Start ClientApp subprocess
265
- command = [
266
- "flwr-clientapp",
267
- "--clientappio-api-address",
268
- io_address,
269
- "--token",
270
- str(token),
271
- ]
272
- command.append("--insecure")
273
-
274
261
  proc = mp_spawn_context.Process(
275
262
  target=_run_flwr_clientapp,
276
- args=(command, os.getpid()),
263
+ kwargs={
264
+ "main_pid": os.getpid(),
265
+ "clientappio_api_address": io_address,
266
+ "run_once": True,
267
+ "token": token,
268
+ },
277
269
  daemon=True,
278
270
  )
279
271
  proc.start()
@@ -424,7 +416,14 @@ def _make_fleet_connection_retry_invoker(
424
416
  )
425
417
 
426
418
 
427
- def _run_flwr_clientapp(args: list[str], main_pid: int) -> None:
419
+ def _run_flwr_clientapp( # pylint: disable=R0917
420
+ main_pid: int,
421
+ clientappio_api_address: str,
422
+ run_once: bool,
423
+ token: Optional[int] = None,
424
+ flwr_dir: Optional[str] = None,
425
+ certificates: Optional[bytes] = None,
426
+ ) -> None:
428
427
  # Monitor the main process in case of SIGKILL
429
428
  def main_process_monitor() -> None:
430
429
  while True:
@@ -434,9 +433,14 @@ def _run_flwr_clientapp(args: list[str], main_pid: int) -> None:
434
433
 
435
434
  threading.Thread(target=main_process_monitor, daemon=True).start()
436
435
 
437
- # Run the command
438
- sys.argv = args
439
- flwr_clientapp()
436
+ # Run flwr-clientapp
437
+ run_clientapp(
438
+ clientappio_api_address=clientappio_api_address,
439
+ run_once=run_once,
440
+ token=token,
441
+ flwr_dir=flwr_dir,
442
+ certificates=certificates,
443
+ )
440
444
 
441
445
 
442
446
  def run_clientappio_api_grpc(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.19.0.dev20250601
3
+ Version: 1.19.0.dev20250603
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
@@ -77,16 +77,14 @@ flwr/cli/utils.py,sha256=brzc0HPhFxJDi4ctfyQi9lW35uOyvQzoOJ8XHeMDIfE,11575
77
77
  flwr/client/__init__.py,sha256=boIhKaK6I977zrILmoTutNx94x5jB0e6F1gnAjaRJnI,1250
78
78
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
79
79
  flwr/client/client_app.py,sha256=zVhi-l3chAb06ozFsKwix3hU_RpOLjST13Ha50AVIPE,16918
80
- flwr/client/clientapp/__init__.py,sha256=nPMoWEB1FhwexuW-vKdhwFkFr_4MW-2YMZExP9vfTGg,800
81
- flwr/client/clientapp/app.py,sha256=N1nd4PnwWzzZc3kn1g01SULXVMriCstCnfDYV_KERqc,9057
82
- flwr/client/clientapp/clientappio_servicer.py,sha256=LmzkxtNQBn5vVrHc0Bhq2WqaK6-LM2v4kfLBN0PiNNM,8522
80
+ flwr/client/clientapp/__init__.py,sha256=Zw9qP5nHFnJ9K1dcR4cdY0fRqN-FaMYFSHJFXoFpUvo,711
83
81
  flwr/client/clientapp/utils.py,sha256=LsiW1OL2VPcjom3xN29pgBQC0UrttQ-xWL_GF1fkKDo,4344
84
82
  flwr/client/dpfedavg_numpy_client.py,sha256=3hul067cT2E9jBhzp7bFnFAZ_D2nWcIUEdHYE05FpzU,7404
85
83
  flwr/client/grpc_adapter_client/__init__.py,sha256=RQWP5mFPROLHKgombiRvPXVWSoVrQ81wvZm0-lOuuBA,742
86
84
  flwr/client/grpc_adapter_client/connection.py,sha256=aj5tTYyE8z2hQLXPPydsJiz8gBDIWLUhfWvqYkAL1L4,3966
87
85
  flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
88
86
  flwr/client/grpc_rere_client/client_interceptor.py,sha256=zFaVHw6AxeNO-7eCKKb-RxrPa7zbM5Z-2-1Efc4adQY,2451
89
- flwr/client/grpc_rere_client/connection.py,sha256=slRDCax2CTwVURURUf8qV9Ph4eDuf67XVLB77PuV9fE,12118
87
+ flwr/client/grpc_rere_client/connection.py,sha256=QEUjpXdWGVn_kaFv6Hv2WmJRpcggjMzR7QFpiAa-r6M,11923
90
88
  flwr/client/grpc_rere_client/grpc_adapter.py,sha256=JvMZ7vCFTaTEo6AzKYh3zDmeQAU7VSjdysbC6t3ufWg,6351
91
89
  flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
92
90
  flwr/client/message_handler/message_handler.py,sha256=X9SXX6et97Lw9_DGD93HKsEBGNjXClcFgc_5aLK0oiU,6541
@@ -124,8 +122,8 @@ flwr/common/exit/exit_code.py,sha256=PNEnCrZfOILjfDAFu5m-2YWEJBrk97xglq4zCUlqV7E
124
122
  flwr/common/exit_handlers.py,sha256=IaqJ60fXZuu7McaRYnoYKtlbH9t4Yl9goNExKqtmQbs,4304
125
123
  flwr/common/grpc.py,sha256=manTaHaPiyYngUq1ErZvvV2B2GxlXUUUGRy3jc3TBIQ,9798
126
124
  flwr/common/heartbeat.py,sha256=SyEpNDnmJ0lni0cWO67rcoJVKasCLmkNHm3dKLeNrLU,5749
127
- flwr/common/inflatable.py,sha256=vBDlaJlgF6sryjglhFcr22zylROmPFwM7QLjVV7XbtU,6837
128
- flwr/common/inflatable_grpc_utils.py,sha256=jue6T8bIBOvsocnGalkF_xqWcXJHdBDPAICWCZnPVwU,3973
125
+ flwr/common/inflatable.py,sha256=9yPsSFOfNM2OIb15JQ6-wY5kblwXiC5zNX-tsp2ZwW0,7017
126
+ flwr/common/inflatable_grpc_utils.py,sha256=KSrV51jaKsaAA__dROtlTAUC5k_FYJDVcPA0uITWM0s,4161
129
127
  flwr/common/logger.py,sha256=JbRf6E2vQxXzpDBq1T8IDUJo_usu3gjWEBPQ6uKcmdg,13049
130
128
  flwr/common/message.py,sha256=HfSeqxwXgf90ilbMlM0vrF4cJWqJVx3jJ0gNmTfgdFw,19628
131
129
  flwr/common/object_ref.py,sha256=p3SfTeqo3Aj16SkB-vsnNn01zswOPdGNBitcbRnqmUk,9134
@@ -134,13 +132,13 @@ flwr/common/pyproject.py,sha256=2SU6yJW7059SbMXgzjOdK1GZRWO6AixDH7BmdxbMvHI,1386
134
132
  flwr/common/record/__init__.py,sha256=cNGccdDoxttqgnUgyKRIqLWULjW-NaSmOufVxtXq-sw,1197
135
133
  flwr/common/record/array.py,sha256=3K01tAf_jedub2r2-vkRshbsjBSiKErAO4KqDgdDaSo,11776
136
134
  flwr/common/record/arrayrecord.py,sha256=CpoqYXM6Iv4XEc9SryCMYmw-bIvP8ut6xWJzRwYJzdU,18008
137
- flwr/common/record/configrecord.py,sha256=nDoIc_-vh7XUx2BuojenpcqSgM2XxD4NyGFAYpmXabM,9652
135
+ flwr/common/record/configrecord.py,sha256=G7U0q39kB0Kyi0zMxFmPxcVemL9NgwVS1qjvI4BRQuU,9763
138
136
  flwr/common/record/conversion_utils.py,sha256=wbNCzy7oAqaA3-arhls_EqRZYXRC4YrWIoE-Gy82fJ0,1191
139
- flwr/common/record/metricrecord.py,sha256=Gxl9TdVpMAHg6pNN2SxB-as8iPDnPx398KEhORU4n3A,8839
137
+ flwr/common/record/metricrecord.py,sha256=KOyJjJbvFV6IwBPbgm92FZ_0_hXpMHuwfCi1rh5Zddk,8954
140
138
  flwr/common/record/recorddict.py,sha256=p7hBimFpKM1XKUe6OAkR_7pYGzGL_EwUJUvJ8odZEcY,14986
141
139
  flwr/common/record/typeddict.py,sha256=dDKgUThs2BscYUNcgP82KP8-qfAYXYftDrf2LszAC_o,3599
142
140
  flwr/common/recorddict_compat.py,sha256=D5SqXWkqBddn5b6K_5UoH7aZ11UaN3lDTlzvHx3-rqk,14119
143
- flwr/common/retry_invoker.py,sha256=T6puUH3nCxdRzQHeanyr-0nTxhRiS1TH07rmef9vuLQ,14482
141
+ flwr/common/retry_invoker.py,sha256=s5IGgRovE19laMetHFePoqIdMBYfz_KdXs-KyfaCrXw,14634
144
142
  flwr/common/secure_aggregation/__init__.py,sha256=MgW6uHGhyFLBAYQqa1Vzs5n2Gc0d4yEw1_NmerFir70,731
145
143
  flwr/common/secure_aggregation/crypto/__init__.py,sha256=5E4q4-Fw0CNz4tLah_QHj7m_rDeM4ucHcFlPWB_Na3Q,738
146
144
  flwr/common/secure_aggregation/crypto/shamir.py,sha256=N8pPa5cEksowNoAqfFm5SP3IuxuVi9GGMa3JOtPniQY,3954
@@ -149,8 +147,8 @@ flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=TrggOlizlny3V2KS7-3
149
147
  flwr/common/secure_aggregation/quantization.py,sha256=ssFZpiRyj9ltIh0Ai3vGkDqWFO4SoqgoD1mDU9XqMEM,2400
150
148
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=dGYhWOBMMDJcQH4_tQNC8-Efqm-ecEUNN9ANz59UnCk,2182
151
149
  flwr/common/secure_aggregation/secaggplus_utils.py,sha256=E_xU-Zd45daO1em7M6C2wOjFXVtJf-6tl7fp-7xq1wo,3214
152
- flwr/common/serde.py,sha256=smtfWWALhn3YOanM9Vco63BJzcYSBCFYc_J2OBkepsE,22379
153
- flwr/common/serde_utils.py,sha256=zF99EnqTNhEd3Xh3tYy2bZ44_8B-QfwNqsuP7vfLVDs,5735
150
+ flwr/common/serde.py,sha256=hHqXbAF-MtSRWsROz4v-P_C4dMDSIt1XJ3Hecxp8os0,23020
151
+ flwr/common/serde_utils.py,sha256=krx2C_W31KpfmDqnDCtULoTkT8WKweWTJ7FHYWtF1r4,5815
154
152
  flwr/common/telemetry.py,sha256=jF47v0SbnBd43XamHtl3wKxs3knFUY2p77cm_2lzZ8M,8762
155
153
  flwr/common/typing.py,sha256=97QRfRRS7sQnjkAI5FDZ01-38oQUSz4i1qqewQmBWRg,6886
156
154
  flwr/common/version.py,sha256=7GAGzPn73Mkh09qhrjbmjZQtcqVhBuzhFBaK4Mk4VRk,1325
@@ -196,16 +194,16 @@ flwr/proto/log_pb2.py,sha256=iKaS3MVn1BS4xHu8uGPFCOi1KWtvVx-H9V4jCUIJghs,1393
196
194
  flwr/proto/log_pb2.pyi,sha256=ipuhgo40sAHTcRzCsGI1HwIstr5q0THPNk_cf62YyME,1448
197
195
  flwr/proto/log_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
198
196
  flwr/proto/log_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
199
- flwr/proto/message_pb2.py,sha256=2yEK9O-lbbHpgUYBnWhq2UWjQTZquO1IVbhTzmiOMtI,4277
200
- flwr/proto/message_pb2.pyi,sha256=W7dLhhVDLxgij7sBc8cJ2zfcusoceBGjhgCIVjaRMHc,8627
197
+ flwr/proto/message_pb2.py,sha256=VoFv02FalR-xegoyqVMC1M_rD02sdWdoAAfFkw00k84,4481
198
+ flwr/proto/message_pb2.pyi,sha256=FmBgs2PsotAdv-OOCEHp4Dc3e6dSo6-CAB3-pgmva4g,9392
201
199
  flwr/proto/message_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
202
200
  flwr/proto/message_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
203
201
  flwr/proto/node_pb2.py,sha256=BzZfAWIX7lV62bZr9f7x16lUZcpg-EImxnwxQXgCbYg,1045
204
202
  flwr/proto/node_pb2.pyi,sha256=CPMeIPzUeI5-Csw9sHktV9UBH4GbqiGuYzGQQKftm6Q,616
205
203
  flwr/proto/node_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
206
204
  flwr/proto/node_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
207
- flwr/proto/recorddict_pb2.py,sha256=G_ArzgRfHVXJTqtIZ6lYN8rZsCcj6p_1KokGUjajtMY,6338
208
- flwr/proto/recorddict_pb2.pyi,sha256=M9dVj5o7sw91pnIBWVl76Ka82sDUiwm-rnv_iV9Omhc,15286
205
+ flwr/proto/recorddict_pb2.py,sha256=eVkcnxMTFa3rvknRNiFuJ8z8xxPqgw7bV04aFiTe1j4,5290
206
+ flwr/proto/recorddict_pb2.pyi,sha256=xHRSK_GWlIynXDQxWNNmmidsj4OjZzVYqosRB6EonmE,14544
209
207
  flwr/proto/recorddict_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
210
208
  flwr/proto/recorddict_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
211
209
  flwr/proto/run_pb2.py,sha256=SWpc2yDTprm7DaabMQne43q_7_NWQN3I66y-d_PpcGg,4727
@@ -286,12 +284,12 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=KouR9PUcrPmMtoLooF4O
286
284
  flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=iSf0mbBAlig7G6subQwBSVjcUCgSihONKdZ1RmQPTOk,4887
287
285
  flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=OsS-6GgCIzMMZDVu5Y-OKjynHVUrpdc_5OrtuB-IbU0,5174
288
286
  flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt2wB38_QltcpOC0gLbpFs,758
289
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=Y92dcvbaN4EHb4Rlut5O2saJsoAN_Tejs4iFtzCS0P0,7189
287
+ flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=SsMtj1EeOgumffWtYTQt-ii3JPldszXvP91C3axznq8,9176
290
288
  flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=DrHubsaLgJCwCeeJPYogQTiP0xYqjxwnT9rh7OP7BoU,6984
291
289
  flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
292
290
  flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=P43PapLZJKbZ0Oo0kP_KcO5zSMvO53SakQgPMiR5d1M,6500
293
291
  flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
294
- flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=dKSSo5H-JUZ_J_9HXQqwzUdLFQ64ZbDj6MvYo68Uxn4,7187
292
+ flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=jIljUNMvZ8dDvSlkyn1c2y9sDAf_QoBr-q_o3BWxJ7o,7199
295
293
  flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
296
294
  flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=PPH89Yqd1XKm-sRJN6R0WQlKT_b4v54Kzl2yzHAFzM8,1437
297
295
  flwr/server/superlink/fleet/vce/backend/backend.py,sha256=-wDHjgAy5mrfEgXj0GxkJI7lhEbgSUyPwmNAf9ZcDzc,2193
@@ -305,7 +303,7 @@ flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=sHJPK1w0tP0m2WCXH2F9l
305
303
  flwr/server/superlink/linkstate/utils.py,sha256=IeLh7iGRCHU5MEWOl7iriaSE4L__8GWOa2OleXadK5M,15444
306
304
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
307
305
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=6-FUUt0GiLcBPljj8bBrUNeAITUoDQOLzaMihKo52hg,2326
308
- flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=JkCqxYNV2Oou6CLdXndRzPjk281cSE4EVDKcuVh7jHE,15556
306
+ flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=qInBXn7xcnNUNIXj_BkjoWfZd96By55gbTsp4onwfDQ,17290
309
307
  flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
310
308
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=0l0F-UjYEk6W7HZmI28PbJQLFxSi_vBHRkdchgdaSMQ,2224
311
309
  flwr/server/superlink/simulation/simulationio_servicer.py,sha256=aJezU8RSJswcmWm7Eoy0BqsU13jrcfuFwX3ljm-cORM,7719
@@ -346,14 +344,20 @@ flwr/superexec/executor.py,sha256=M5ucqSE53jfRtuCNf59WFLqQvA1Mln4741TySeZE7qQ,31
346
344
  flwr/superexec/simulation.py,sha256=j6YwUvBN7EQ09ID7MYOCVZ70PGbuyBy8f9bXU0EszEM,4088
347
345
  flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
348
346
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
349
- flwr/supernode/cli/__init__.py,sha256=usct6KqEN3NFrwAA6K1RUDRJbUs0lia8o8FFF5Sxnc4,815
350
- flwr/supernode/cli/flower_supernode.py,sha256=pr16i1xWDzxxB5lcRTaSd4DVQvVOC3G0zwLliS9jSZ0,8766
347
+ flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
348
+ flwr/supernode/cli/flower_supernode.py,sha256=ly2AQhbla2sufDaMsENaEALDEd0a4CS4D0eUrUOkHzY,8778
349
+ flwr/supernode/cli/flwr_clientapp.py,sha256=ORsNxviXOKGzZdcp5DEiHIuj4RycgB2OaPDaTTJJWz4,2555
351
350
  flwr/supernode/nodestate/__init__.py,sha256=CyLLObbmmVgfRO88UCM0VMait1dL57mUauUDfuSHsbU,976
352
- flwr/supernode/nodestate/in_memory_nodestate.py,sha256=brV7TMMzS93tXk6ntpoYjtPK5qiSF3XD2W-uUdUVucc,1270
353
- flwr/supernode/nodestate/nodestate.py,sha256=-LAjZOnS7VyHC05ll3b31cYDjwAt6l4WmYt7duVLRKk,1024
351
+ flwr/supernode/nodestate/in_memory_nodestate.py,sha256=4ZiLA45fMi2bJgmfDNLtiv-gVNru95Bi48xBy7xtatA,5212
352
+ flwr/supernode/nodestate/nodestate.py,sha256=SgblnKtqzTHRiODwg4QUREw1-uYPQrLzoeTBlROHf_0,4571
354
353
  flwr/supernode/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
355
- flwr/supernode/start_client_internal.py,sha256=HktXGD-3hUnGmyr_o7bLnJoyNdHGEZ8mUnvQorhOxwY,17378
356
- flwr_nightly-1.19.0.dev20250601.dist-info/METADATA,sha256=of7LtQhl7xYftvTlKtRd8FGbSnmJQWhVtsRdU5_6lbQ,15910
357
- flwr_nightly-1.19.0.dev20250601.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
358
- flwr_nightly-1.19.0.dev20250601.dist-info/entry_points.txt,sha256=08k99PaHg3Wr6W49rFXYtjmgcfIdpFLNeu6O0bXDYnU,370
359
- flwr_nightly-1.19.0.dev20250601.dist-info/RECORD,,
354
+ flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
355
+ flwr/supernode/runtime/run_clientapp.py,sha256=sEmrN1F-tV2YAzw06Dk4RM696yyP4xqm2gFLkp53Y6k,7402
356
+ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca8gxdEo,717
357
+ flwr/supernode/servicer/clientappio/__init__.py,sha256=vJyOjO2FXZ2URbnthmdsgs6948wbYfdq1L1V8Um-Lr8,895
358
+ flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=LmzkxtNQBn5vVrHc0Bhq2WqaK6-LM2v4kfLBN0PiNNM,8522
359
+ flwr/supernode/start_client_internal.py,sha256=fI44QAbNbrRomwHI83X1sqtPlDcV8oIAWuZ0DxMTCVY,17602
360
+ flwr_nightly-1.19.0.dev20250603.dist-info/METADATA,sha256=uMka7DkhCI_KfSOFFsib_P7qj7UO05ccr88R1qecUi4,15910
361
+ flwr_nightly-1.19.0.dev20250603.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
362
+ flwr_nightly-1.19.0.dev20250603.dist-info/entry_points.txt,sha256=jNpDXGBGgs21RqUxelF_jwGaxtqFwm-MQyfz-ZqSjrA,367
363
+ flwr_nightly-1.19.0.dev20250603.dist-info/RECORD,,
@@ -3,7 +3,7 @@ flower-simulation=flwr.simulation.run_simulation:run_simulation_from_cli
3
3
  flower-superlink=flwr.server.app:run_superlink
4
4
  flower-supernode=flwr.supernode.cli:flower_supernode
5
5
  flwr=flwr.cli.app:app
6
- flwr-clientapp=flwr.client.clientapp:flwr_clientapp
6
+ flwr-clientapp=flwr.supernode.cli:flwr_clientapp
7
7
  flwr-serverapp=flwr.server.serverapp:flwr_serverapp
8
8
  flwr-simulation=flwr.simulation.app:flwr_simulation
9
9