flwr-nightly 1.26.0.dev20260201__py3-none-any.whl → 1.26.0.dev20260203__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 (29) hide show
  1. flwr/cli/federation/ls.py +4 -1
  2. flwr/cli/utils.py +2 -0
  3. flwr/common/typing.py +1 -0
  4. flwr/proto/clientappio_pb2.py +2 -2
  5. flwr/proto/clientappio_pb2_grpc.py +56 -56
  6. flwr/proto/clientappio_pb2_grpc.pyi +52 -52
  7. flwr/proto/federation_pb2.py +2 -2
  8. flwr/proto/federation_pb2.pyi +16 -4
  9. flwr/proto/run_pb2.py +5 -13
  10. flwr/proto/run_pb2.pyi +0 -57
  11. flwr/proto/serverappio_pb2.py +2 -2
  12. flwr/proto/serverappio_pb2_grpc.py +56 -100
  13. flwr/proto/serverappio_pb2_grpc.pyi +52 -72
  14. flwr/proto/simulationio_pb2.py +2 -2
  15. flwr/proto/simulationio_pb2_grpc.py +7 -51
  16. flwr/proto/simulationio_pb2_grpc.pyi +24 -44
  17. flwr/server/superlink/serverappio/serverappio_servicer.py +0 -18
  18. flwr/server/superlink/simulation/simulationio_servicer.py +0 -19
  19. flwr/supercore/constant.py +1 -0
  20. flwr/supercore/object_store/sql_object_store.py +22 -18
  21. flwr/superlink/federation/federation_manager.py +2 -2
  22. flwr/superlink/federation/noop_federation_manager.py +5 -4
  23. flwr/superlink/servicer/control/control_servicer.py +5 -3
  24. flwr/supernode/runtime/run_clientapp.py +12 -12
  25. flwr/supernode/servicer/clientappio/clientappio_servicer.py +4 -4
  26. {flwr_nightly-1.26.0.dev20260201.dist-info → flwr_nightly-1.26.0.dev20260203.dist-info}/METADATA +4 -4
  27. {flwr_nightly-1.26.0.dev20260201.dist-info → flwr_nightly-1.26.0.dev20260203.dist-info}/RECORD +29 -29
  28. {flwr_nightly-1.26.0.dev20260201.dist-info → flwr_nightly-1.26.0.dev20260203.dist-info}/WHEEL +0 -0
  29. {flwr_nightly-1.26.0.dev20260201.dist-info → flwr_nightly-1.26.0.dev20260203.dist-info}/entry_points.txt +0 -0
@@ -74,30 +74,24 @@ class SimulationIoStub:
74
74
  flwr.proto.appio_pb2.PullAppInputsRequest,
75
75
  flwr.proto.appio_pb2.PullAppInputsResponse,
76
76
  ]
77
- """///////////////////////////////////////////////////////////////////////////
78
- Specific endpoints shared by ServerAppIo and SimulationIo
79
- ///////////////////////////////////////////////////////////////////////////
80
-
81
- Pull Simulation inputs
82
- """
77
+ """Pull app inputs"""
83
78
 
84
79
  PushAppOutputs: grpc.UnaryUnaryMultiCallable[
85
80
  flwr.proto.appio_pb2.PushAppOutputsRequest,
86
81
  flwr.proto.appio_pb2.PushAppOutputsResponse,
87
82
  ]
88
- """Push Simulation outputs"""
89
-
90
- GetRunStatus: grpc.UnaryUnaryMultiCallable[
91
- flwr.proto.run_pb2.GetRunStatusRequest,
92
- flwr.proto.run_pb2.GetRunStatusResponse,
93
- ]
94
- """Get Run Status"""
83
+ """Push app outputs"""
95
84
 
96
85
  UpdateRunStatus: grpc.UnaryUnaryMultiCallable[
97
86
  flwr.proto.run_pb2.UpdateRunStatusRequest,
98
87
  flwr.proto.run_pb2.UpdateRunStatusResponse,
99
88
  ]
100
- """Update the status of a given run"""
89
+ """///////////////////////////////////////////////////////////////////////////
90
+ Specific endpoints shared by ServerAppIo and SimulationIo
91
+ ///////////////////////////////////////////////////////////////////////////
92
+
93
+ Update the status of a given run
94
+ """
101
95
 
102
96
  PushLogs: grpc.UnaryUnaryMultiCallable[
103
97
  flwr.proto.log_pb2.PushLogsRequest,
@@ -155,30 +149,24 @@ class SimulationIoAsyncStub:
155
149
  flwr.proto.appio_pb2.PullAppInputsRequest,
156
150
  flwr.proto.appio_pb2.PullAppInputsResponse,
157
151
  ]
158
- """///////////////////////////////////////////////////////////////////////////
159
- Specific endpoints shared by ServerAppIo and SimulationIo
160
- ///////////////////////////////////////////////////////////////////////////
161
-
162
- Pull Simulation inputs
163
- """
152
+ """Pull app inputs"""
164
153
 
165
154
  PushAppOutputs: grpc.aio.UnaryUnaryMultiCallable[
166
155
  flwr.proto.appio_pb2.PushAppOutputsRequest,
167
156
  flwr.proto.appio_pb2.PushAppOutputsResponse,
168
157
  ]
169
- """Push Simulation outputs"""
170
-
171
- GetRunStatus: grpc.aio.UnaryUnaryMultiCallable[
172
- flwr.proto.run_pb2.GetRunStatusRequest,
173
- flwr.proto.run_pb2.GetRunStatusResponse,
174
- ]
175
- """Get Run Status"""
158
+ """Push app outputs"""
176
159
 
177
160
  UpdateRunStatus: grpc.aio.UnaryUnaryMultiCallable[
178
161
  flwr.proto.run_pb2.UpdateRunStatusRequest,
179
162
  flwr.proto.run_pb2.UpdateRunStatusResponse,
180
163
  ]
181
- """Update the status of a given run"""
164
+ """///////////////////////////////////////////////////////////////////////////
165
+ Specific endpoints shared by ServerAppIo and SimulationIo
166
+ ///////////////////////////////////////////////////////////////////////////
167
+
168
+ Update the status of a given run
169
+ """
182
170
 
183
171
  PushLogs: grpc.aio.UnaryUnaryMultiCallable[
184
172
  flwr.proto.log_pb2.PushLogsRequest,
@@ -246,12 +234,7 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
246
234
  request: flwr.proto.appio_pb2.PullAppInputsRequest,
247
235
  context: _ServicerContext,
248
236
  ) -> typing.Union[flwr.proto.appio_pb2.PullAppInputsResponse, collections.abc.Awaitable[flwr.proto.appio_pb2.PullAppInputsResponse]]:
249
- """///////////////////////////////////////////////////////////////////////////
250
- Specific endpoints shared by ServerAppIo and SimulationIo
251
- ///////////////////////////////////////////////////////////////////////////
252
-
253
- Pull Simulation inputs
254
- """
237
+ """Pull app inputs"""
255
238
 
256
239
  @abc.abstractmethod
257
240
  def PushAppOutputs(
@@ -259,15 +242,7 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
259
242
  request: flwr.proto.appio_pb2.PushAppOutputsRequest,
260
243
  context: _ServicerContext,
261
244
  ) -> typing.Union[flwr.proto.appio_pb2.PushAppOutputsResponse, collections.abc.Awaitable[flwr.proto.appio_pb2.PushAppOutputsResponse]]:
262
- """Push Simulation outputs"""
263
-
264
- @abc.abstractmethod
265
- def GetRunStatus(
266
- self,
267
- request: flwr.proto.run_pb2.GetRunStatusRequest,
268
- context: _ServicerContext,
269
- ) -> typing.Union[flwr.proto.run_pb2.GetRunStatusResponse, collections.abc.Awaitable[flwr.proto.run_pb2.GetRunStatusResponse]]:
270
- """Get Run Status"""
245
+ """Push app outputs"""
271
246
 
272
247
  @abc.abstractmethod
273
248
  def UpdateRunStatus(
@@ -275,7 +250,12 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
275
250
  request: flwr.proto.run_pb2.UpdateRunStatusRequest,
276
251
  context: _ServicerContext,
277
252
  ) -> typing.Union[flwr.proto.run_pb2.UpdateRunStatusResponse, collections.abc.Awaitable[flwr.proto.run_pb2.UpdateRunStatusResponse]]:
278
- """Update the status of a given run"""
253
+ """///////////////////////////////////////////////////////////////////////////
254
+ Specific endpoints shared by ServerAppIo and SimulationIo
255
+ ///////////////////////////////////////////////////////////////////////////
256
+
257
+ Update the status of a given run
258
+ """
279
259
 
280
260
  @abc.abstractmethod
281
261
  def PushLogs(
@@ -36,7 +36,6 @@ from flwr.common.serde import (
36
36
  message_from_proto,
37
37
  message_to_proto,
38
38
  run_status_from_proto,
39
- run_status_to_proto,
40
39
  run_to_proto,
41
40
  )
42
41
  from flwr.common.typing import Fab, RunStatus
@@ -76,8 +75,6 @@ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
76
75
  from flwr.proto.run_pb2 import ( # pylint: disable=E0611
77
76
  GetRunRequest,
78
77
  GetRunResponse,
79
- GetRunStatusRequest,
80
- GetRunStatusResponse,
81
78
  UpdateRunStatusRequest,
82
79
  UpdateRunStatusResponse,
83
80
  )
@@ -434,21 +431,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
434
431
  state.add_serverapp_log(request.run_id, merged_logs)
435
432
  return PushLogsResponse()
436
433
 
437
- def GetRunStatus(
438
- self, request: GetRunStatusRequest, context: grpc.ServicerContext
439
- ) -> GetRunStatusResponse:
440
- """Get the status of a run."""
441
- log(DEBUG, "ServerAppIoServicer.GetRunStatus")
442
- state = self.state_factory.state()
443
-
444
- # Get run status from LinkState
445
- run_statuses = state.get_run_status(set(request.run_ids))
446
- run_status_dict = {
447
- run_id: run_status_to_proto(run_status)
448
- for run_id, run_status in run_statuses.items()
449
- }
450
- return GetRunStatusResponse(run_status_dict=run_status_dict)
451
-
452
434
  def SendAppHeartbeat(
453
435
  self, request: SendAppHeartbeatRequest, context: grpc.ServicerContext
454
436
  ) -> SendAppHeartbeatResponse:
@@ -29,7 +29,6 @@ from flwr.common.serde import (
29
29
  context_to_proto,
30
30
  fab_to_proto,
31
31
  run_status_from_proto,
32
- run_status_to_proto,
33
32
  run_to_proto,
34
33
  )
35
34
  from flwr.common.typing import Fab, RunStatus
@@ -57,8 +56,6 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
57
56
  GetFederationOptionsResponse,
58
57
  GetRunRequest,
59
58
  GetRunResponse,
60
- GetRunStatusRequest,
61
- GetRunStatusResponse,
62
59
  UpdateRunStatusRequest,
63
60
  UpdateRunStatusResponse,
64
61
  )
@@ -219,22 +216,6 @@ class SimulationIoServicer(simulationio_pb2_grpc.SimulationIoServicer):
219
216
  )
220
217
  return UpdateRunStatusResponse()
221
218
 
222
- def GetRunStatus(
223
- self, request: GetRunStatusRequest, context: ServicerContext
224
- ) -> GetRunStatusResponse:
225
- """Get status of requested runs."""
226
- log(DEBUG, "SimultionIoServicer.GetRunStatus")
227
- state = self.state_factory.state()
228
-
229
- statuses = state.get_run_status(set(request.run_ids))
230
-
231
- return GetRunStatusResponse(
232
- run_status_dict={
233
- run_id: run_status_to_proto(status)
234
- for run_id, status in statuses.items()
235
- }
236
- )
237
-
238
219
  def PushLogs(
239
220
  self, request: PushLogsRequest, context: grpc.ServicerContext
240
221
  ) -> PushLogsResponse:
@@ -59,6 +59,7 @@ MIME_MAP = {
59
59
 
60
60
  # Constants for federations
61
61
  NOOP_FEDERATION = f"@{NOOP_ACCOUNT_NAME}/default"
62
+ NOOP_FEDERATION_DESCRIPTION = "A federation for testing and development purposes."
62
63
 
63
64
  # Constants for exit handling
64
65
  FORCE_EXIT_TIMEOUT_SECONDS = 5 # Used in `flwr_exit` function
@@ -52,24 +52,24 @@ class SqlObjectStore(ObjectStore, SqlMixin):
52
52
 
53
53
  child_ids = [child.object_id for child in tree_node.children]
54
54
  with self.session():
55
+ # Insert new object if it doesn't exist (race-condition safe)
56
+ # RETURNING returns a row only if the insert succeeded
55
57
  rows = self.query(
56
- "SELECT object_id, is_available FROM objects "
57
- "WHERE object_id = :object_id",
58
- {"object_id": obj_id},
58
+ "INSERT INTO objects "
59
+ "(object_id, content, is_available, ref_count) "
60
+ "VALUES (:object_id, :content, :is_available, :ref_count) "
61
+ "ON CONFLICT (object_id) DO NOTHING "
62
+ "RETURNING object_id",
63
+ {
64
+ "object_id": obj_id,
65
+ "content": b"",
66
+ "is_available": 0,
67
+ "ref_count": 0,
68
+ },
59
69
  )
60
- if not rows:
61
- # Insert new object
62
- self.query(
63
- "INSERT INTO objects "
64
- "(object_id, content, is_available, ref_count) "
65
- "VALUES (:object_id, :content, :is_available, :ref_count)",
66
- {
67
- "object_id": obj_id,
68
- "content": b"",
69
- "is_available": 0,
70
- "ref_count": 0,
71
- },
72
- )
70
+
71
+ if rows:
72
+ # New object inserted: set up child relationships
73
73
  for cid in child_ids:
74
74
  self.query(
75
75
  "INSERT INTO object_children (parent_id, child_id) "
@@ -83,8 +83,12 @@ class SqlObjectStore(ObjectStore, SqlMixin):
83
83
  )
84
84
  new_objects.append(obj_id)
85
85
  else:
86
- # Add to the list of new objects if not available
87
- if not rows[0]["is_available"]:
86
+ # Object exists: check if unavailable
87
+ rows = self.query(
88
+ "SELECT is_available FROM objects WHERE object_id = :object_id",
89
+ {"object_id": obj_id},
90
+ )
91
+ if rows and not rows[0]["is_available"]:
88
92
  new_objects.append(obj_id)
89
93
 
90
94
  # Ensure run mapping
@@ -56,8 +56,8 @@ class FederationManager(ABC):
56
56
  """Given a node ID, check if it is in the federation."""
57
57
 
58
58
  @abstractmethod
59
- def get_federations(self, flwr_aid: str) -> list[str]:
60
- """Get federations of which the account is a member."""
59
+ def get_federations(self, flwr_aid: str) -> list[tuple[str, str]]:
60
+ """Get federations (name, description) of which the account is a member."""
61
61
 
62
62
  @abstractmethod
63
63
  def get_details(self, federation: str) -> Federation:
@@ -18,7 +18,7 @@
18
18
  from flwr.common.constant import NOOP_ACCOUNT_NAME, NOOP_FLWR_AID
19
19
  from flwr.common.typing import Federation
20
20
  from flwr.proto.federation_pb2 import Account # pylint: disable=E0611
21
- from flwr.supercore.constant import NOOP_FEDERATION
21
+ from flwr.supercore.constant import NOOP_FEDERATION, NOOP_FEDERATION_DESCRIPTION
22
22
 
23
23
  from .federation_manager import FederationManager
24
24
 
@@ -48,11 +48,11 @@ class NoOpFederationManager(FederationManager):
48
48
  raise ValueError(f"Federation '{federation}' does not exist.")
49
49
  return True
50
50
 
51
- def get_federations(self, flwr_aid: str) -> list[str]:
52
- """Get federations of which the account is a member."""
51
+ def get_federations(self, flwr_aid: str) -> list[tuple[str, str]]:
52
+ """Get federations (name, description) of which the account is a member."""
53
53
  if flwr_aid != NOOP_FLWR_AID:
54
54
  return []
55
- return [NOOP_FEDERATION]
55
+ return [(NOOP_FEDERATION, NOOP_FEDERATION_DESCRIPTION)]
56
56
 
57
57
  def get_details(self, federation: str) -> Federation:
58
58
  """Get details of the federation."""
@@ -66,6 +66,7 @@ class NoOpFederationManager(FederationManager):
66
66
  ]
67
67
  return Federation(
68
68
  name=NOOP_FEDERATION,
69
+ description=NOOP_FEDERATION_DESCRIPTION,
69
70
  accounts=[Account(id=NOOP_FLWR_AID, name=NOOP_ACCOUNT_NAME)],
70
71
  nodes=nodes,
71
72
  runs=runs,
@@ -536,9 +536,10 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
536
536
 
537
537
  # Get federations the account is a member of
538
538
  federations = state.federation_manager.get_federations(flwr_aid=flwr_aid)
539
-
540
539
  return ListFederationsResponse(
541
- federations=[Federation(name=fed) for fed in federations]
540
+ federations=[
541
+ Federation(name=fed[0], description=fed[1]) for fed in federations
542
+ ]
542
543
  )
543
544
 
544
545
  def ShowFederation(
@@ -558,7 +559,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
558
559
 
559
560
  # Ensure flwr_aid is a member of the requested federation
560
561
  federation = request.federation_name
561
- if federation not in federations:
562
+ if federation not in [fed[0] for fed in federations]:
562
563
  context.abort(
563
564
  grpc.StatusCode.FAILED_PRECONDITION,
564
565
  f"Federation '{federation}' does not exist or you are "
@@ -571,6 +572,7 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
571
572
  # Build Federation proto object
572
573
  federation_proto = Federation(
573
574
  name=federation,
575
+ member_aids=[acc.id for acc in details.accounts], # Deprecated in v1.26.0
574
576
  accounts=details.accounts,
575
577
  nodes=details.nodes,
576
578
  runs=[run_to_proto(run) for run in details.runs],
@@ -110,7 +110,7 @@ def run_clientapp( # pylint: disable=R0913, R0914, R0917
110
110
  heartbeat_sender.start()
111
111
 
112
112
  # Pull Message, Context, Run and (optional) FAB from SuperNode
113
- message, context, run, fab = pull_clientappinputs(stub=stub, token=token)
113
+ message, context, run, fab = pull_appinputs(stub=stub, token=token)
114
114
 
115
115
  try:
116
116
 
@@ -152,7 +152,7 @@ def run_clientapp( # pylint: disable=R0913, R0914, R0917
152
152
  reply_message = Message(Error(code=e_code, reason=reason), reply_to=message)
153
153
 
154
154
  # Push Message and Context to SuperNode
155
- _ = push_clientappoutputs(
155
+ _ = push_appoutputs(
156
156
  stub=stub, token=token, message=reply_message, context=context
157
157
  )
158
158
 
@@ -165,15 +165,15 @@ def run_clientapp( # pylint: disable=R0913, R0914, R0917
165
165
  )
166
166
 
167
167
 
168
- def pull_clientappinputs(
168
+ def pull_appinputs(
169
169
  stub: ClientAppIoStub, token: str
170
170
  ) -> tuple[Message, Context, Run, Fab | None]:
171
- """Pull ClientAppInputs from SuperNode."""
171
+ """Pull AppInputs from SuperNode."""
172
172
  masked_token = mask_string(token)
173
- log(INFO, "[flwr-clientapp] Pull `ClientAppInputs` for token %s", masked_token)
173
+ log(INFO, "[flwr-clientapp] Pull `AppInputs` for token %s", masked_token)
174
174
  try:
175
175
  # Pull Context, Run and (optional) FAB
176
- res: PullAppInputsResponse = stub.PullClientAppInputs(
176
+ res: PullAppInputsResponse = stub.PullAppInputs(
177
177
  PullAppInputsRequest(token=token)
178
178
  )
179
179
  context = context_from_proto(res.context)
@@ -201,16 +201,16 @@ def pull_clientappinputs(
201
201
  message.metadata.__dict__["_message_id"] = object_tree.object_id
202
202
  return message, context, run, fab
203
203
  except grpc.RpcError as e:
204
- log(ERROR, "[PullClientAppInputs] gRPC error occurred: %s", str(e))
204
+ log(ERROR, "[PullAppInputs] gRPC error occurred: %s", str(e))
205
205
  raise e
206
206
 
207
207
 
208
- def push_clientappoutputs(
208
+ def push_appoutputs(
209
209
  stub: ClientAppIoStub, token: str, message: Message, context: Context
210
210
  ) -> PushAppOutputsResponse:
211
- """Push ClientAppOutputs to SuperNode."""
211
+ """Push AppOutputs to SuperNode."""
212
212
  masked_token = mask_string(token)
213
- log(INFO, "[flwr-clientapp] Push `ClientAppOutputs` for token %s", masked_token)
213
+ log(INFO, "[flwr-clientapp] Push `AppOutputs` for token %s", masked_token)
214
214
  # Set message ID
215
215
  message.metadata.__dict__["_message_id"] = message.object_id
216
216
  proto_message = message_to_proto(remove_content_from_message(message))
@@ -250,10 +250,10 @@ def push_clientappoutputs(
250
250
  )
251
251
 
252
252
  # Push Context
253
- res: PushAppOutputsResponse = stub.PushClientAppOutputs(
253
+ res: PushAppOutputsResponse = stub.PushAppOutputs(
254
254
  PushAppOutputsRequest(token=token, context=proto_context)
255
255
  )
256
256
  return res
257
257
  except grpc.RpcError as e:
258
- log(ERROR, "[PushClientAppOutputs] gRPC error occurred: %s", str(e))
258
+ log(ERROR, "[PushAppOutputs] gRPC error occurred: %s", str(e))
259
259
  raise e
@@ -129,11 +129,11 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
129
129
 
130
130
  return GetRunResponse(run=run_to_proto(run))
131
131
 
132
- def PullClientAppInputs(
132
+ def PullAppInputs(
133
133
  self, request: PullAppInputsRequest, context: grpc.ServicerContext
134
134
  ) -> PullAppInputsResponse:
135
135
  """Pull Message, Context, and Run."""
136
- log(DEBUG, "ClientAppIo.PullClientAppInputs")
136
+ log(DEBUG, "ClientAppIo.PullAppInputs")
137
137
 
138
138
  # Initialize state and ffs connection
139
139
  state = self.state_factory.state()
@@ -176,11 +176,11 @@ class ClientAppIoServicer(clientappio_pb2_grpc.ClientAppIoServicer):
176
176
  fab=fab_to_proto(fab),
177
177
  )
178
178
 
179
- def PushClientAppOutputs(
179
+ def PushAppOutputs(
180
180
  self, request: PushAppOutputsRequest, context: grpc.ServicerContext
181
181
  ) -> PushAppOutputsResponse:
182
182
  """Push Message and Context."""
183
- log(DEBUG, "ClientAppIo.PushClientAppOutputs")
183
+ log(DEBUG, "ClientAppIo.PushAppOutputs")
184
184
 
185
185
  # Initialize state connection
186
186
  state = self.state_factory.state()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.26.0.dev20260201
3
+ Version: 1.26.0.dev20260203
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
@@ -46,11 +46,11 @@ Requires-Dist: ray (==2.51.1) ; (python_version >= "3.10" and python_version < "
46
46
  Requires-Dist: ray (==2.51.1) ; (sys_platform != "win32" and python_version == "3.13") and (extra == "simulation")
47
47
  Requires-Dist: requests (>=2.31.0,<3.0.0)
48
48
  Requires-Dist: rich (>=13.5.0,<14.0.0)
49
- Requires-Dist: starlette (>=0.49.1,<0.50.0) ; extra == "rest"
49
+ Requires-Dist: starlette (>=0.50.0,<0.51.0) ; extra == "rest"
50
50
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
51
51
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
52
52
  Requires-Dist: typer (>=0.12.5,<0.21.0)
53
- Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
53
+ Requires-Dist: uvicorn[standard] (>=0.40.0,<0.41.0) ; extra == "rest"
54
54
  Project-URL: Documentation, https://flower.ai
55
55
  Project-URL: Homepage, https://flower.ai
56
56
  Project-URL: Repository, https://github.com/adap/flower
@@ -67,7 +67,7 @@ Description-Content-Type: text/markdown
67
67
  <a href="https://flower.ai/">Website</a> |
68
68
  <a href="https://flower.ai/blog">Blog</a> |
69
69
  <a href="https://flower.ai/docs/">Docs</a> |
70
- <a href="https://flower.ai/events/flower-ai-summit-2025">Summit</a> |
70
+ <a href="https://flower.ai/events/flower-ai-summit-2026">Summit</a> |
71
71
  <a href="https://flower.ai/join-slack">Slack</a>
72
72
  <br /><br />
73
73
  </p>
@@ -23,7 +23,7 @@ flwr/cli/config_utils.py,sha256=LNmbPODWefsEtt4ov63BFtuTcK1Pb8Z-AHt1_haWWdA,7841
23
23
  flwr/cli/constant.py,sha256=MYLI7m9ntwWNkFgEEtKVo1JWX3umf_0EdqY8nJy-83Y,3525
24
24
  flwr/cli/example.py,sha256=SNTorkKPrx1rOryGREUyZu8TcOc1-vFv1zEddaysdY0,2216
25
25
  flwr/cli/federation/__init__.py,sha256=okxswL4fAjApI9gV_alU1lRkTUcQRbwlzvtUTLz61fE,793
26
- flwr/cli/federation/ls.py,sha256=VwoM0BrlcvQvE4oGqFol4sAI9JqtR32SYN5gzDfmVPY,10144
26
+ flwr/cli/federation/ls.py,sha256=k3FyGrH_xh_OdHqw5oj1S5RTKm8ZBqxeA4m6fEEoQx8,10278
27
27
  flwr/cli/flower_config.py,sha256=YQfuFGW52jf6EoAxWrXQYw6lmuH0j2qsZ0twHRLxx4k,15278
28
28
  flwr/cli/install.py,sha256=AKjJxDr_kBJirpqMg_EemlP23CfH5UF3h5IjtJQ_xPs,9124
29
29
  flwr/cli/log.py,sha256=BPA0dvGlXx5PrtURPua5fJyF7iVrb28K4fEY2Uth0EE,7317
@@ -42,7 +42,7 @@ flwr/cli/supernode/ls.py,sha256=mmpwIpwp5YZSdq3gDlv0h8QpKoMBgZWrMrvJm_ltiRw,7594
42
42
  flwr/cli/supernode/register.py,sha256=HzgJ1Q8Mlx7oJE-2kRLbIX2OrQP7wM0IeywirLqyz9Y,4724
43
43
  flwr/cli/supernode/unregister.py,sha256=ha8-oTXA4NW8xHLyQPHn-e0f7-9bF2QyjXxUD299O6s,2938
44
44
  flwr/cli/typing.py,sha256=xGAIv9mAVzs6UXapzu4i8bQ-MckzHMSihtLcnu5SWGU,7562
45
- flwr/cli/utils.py,sha256=JiKK7PqNHDUERdhaDPEHNcp2rELthS3GWGBPqwwM02c,17337
45
+ flwr/cli/utils.py,sha256=BTPz9p6X5_u6cZvr43pzfuT26t6XJnXPwUu-0Tp2yCk,17442
46
46
  flwr/client/__init__.py,sha256=xwkPJfdeWxIIfmiPE5vnmnY_JbTlErP0Qs9eBP6qRFg,1252
47
47
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
48
48
  flwr/client/dpfedavg_numpy_client.py,sha256=ELDHyEJcTB-FlLhHC-JXy8HuB3ZFHfT0HL3g1VSWY5w,7451
@@ -119,7 +119,7 @@ flwr/common/secure_aggregation/secaggplus_utils.py,sha256=E_xU-Zd45daO1em7M6C2wO
119
119
  flwr/common/serde.py,sha256=FqqJqNqCk-DryCOgTGkabENvFeU2Q0LieLe0bt3qBbU,22342
120
120
  flwr/common/serde_utils.py,sha256=Vk49PnZWRgo0NrvBhFqH-Li7sMFVVgyrs3Ck7kHB-ZE,5820
121
121
  flwr/common/telemetry.py,sha256=7HNy5ytioJ3SbFtaKNucwYYC-IXEOXphitZbdHmSlfk,8924
122
- flwr/common/typing.py,sha256=KyyZXr6GM_jdKn8eNpRuBiBQaMBSTxApDL6qWOY3g8E,7367
122
+ flwr/common/typing.py,sha256=5wBdrZ2VFDlerywQyI_WTgrgPcZ68YGamok79Tg8U60,7388
123
123
  flwr/compat/__init__.py,sha256=gbfDQKKKMZzi3GswyVRgyLdDlHiWj3wU6dg7y6m5O_s,752
124
124
  flwr/compat/client/__init__.py,sha256=qpbo0lcxdNL4qy5KHqiGm8OLxSxkYgI_-dLh5rwhtcI,746
125
125
  flwr/compat/client/app.py,sha256=oBOB-gYm0oqxtfAp58QZtv3dyUsPxjFm__f1_teenHU,27178
@@ -135,10 +135,10 @@ flwr/proto/appio_pb2.py,sha256=GhleCmuqLiDqvumA0qgVl37NTwuan_K_XpUKStXZxwU,4274
135
135
  flwr/proto/appio_pb2.pyi,sha256=pbrd1mRg0q7mbGqkJYYX1-GwzhiSnuZpjrAJU5im0Og,9512
136
136
  flwr/proto/appio_pb2_grpc.py,sha256=f8jZU97X0SNIz4PQ9qj43yAhgVzmaGInItUCOAGZ7tU,897
137
137
  flwr/proto/appio_pb2_grpc.pyi,sha256=M-7_sdP1mjiKKC4o13hXUx5sEnX3BXSIXgovr9tNVCg,1071
138
- flwr/proto/clientappio_pb2.py,sha256=VRBIUTnrkoFR4LuwFPBUtajvQhCYuxWKHTv6Qhf_DYw,2920
138
+ flwr/proto/clientappio_pb2.py,sha256=kFTbDt-0TUeqF2rqNapoWQwTWu5IHeOMCQP0ZNr3EE8,2905
139
139
  flwr/proto/clientappio_pb2.pyi,sha256=OsUGEduv1iJCew8C4cMz87Y5uQAhHDmxNyVfwA4kXd8,824
140
- flwr/proto/clientappio_pb2_grpc.py,sha256=Xf6VhpV-wXnrpZE-flaVHlGUDP1Q1-c6xmlZYwOmK5Y,22912
141
- flwr/proto/clientappio_pb2_grpc.pyi,sha256=OTD5b8s-FyUgVpKJHrVgLPo6CGzUTTZJPGxEGbj-8oo,12086
140
+ flwr/proto/clientappio_pb2_grpc.py,sha256=Wv9zKVk2h84OF3NPFsIJMUzf8T6lTApkzv8cTJ9TPtk,22814
141
+ flwr/proto/clientappio_pb2_grpc.pyi,sha256=gJZJf9Ol0WeX0Kvsv6TEWwK5MDut-OyrfhvsU6HNKFU,12008
142
142
  flwr/proto/control_pb2.py,sha256=RSrFkLnCxmrW9HXv8Qj2H7_34568HU9uKe9D23uPnBE,9231
143
143
  flwr/proto/control_pb2.pyi,sha256=tTdf9mOD_rrN96l9uh8rBPc1-sTGHOdiAhtIY9mGtZc,16528
144
144
  flwr/proto/control_pb2_grpc.py,sha256=XDGrK2tIT_AcopBnygjddXZRdBTtxP29q-9mK63PsP4,23321
@@ -151,8 +151,8 @@ flwr/proto/fab_pb2.py,sha256=QDkVHGRGmugjQQUiN8A_okppZ5e2pJi5KipjnWmF6e4,2320
151
151
  flwr/proto/fab_pb2.pyi,sha256=PUUZ1FHeTwXxjVmTX14Vx5gmgRSFvoW_e5v_Z5qkT54,3948
152
152
  flwr/proto/fab_pb2_grpc.py,sha256=jmhCnnwSqBpZ0329XGUGARbcz5sHrr0WrXwccqzc3Vs,895
153
153
  flwr/proto/fab_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
154
- flwr/proto/federation_pb2.py,sha256=Kqspf1g8vDVvPzAjC0weEk1WONzFlqyFMAOWYxsrck4,1886
155
- flwr/proto/federation_pb2.pyi,sha256=powYnY1uobS10KD9RT0oRKAPYqGxIBAbZhdn59nA3YA,2695
154
+ flwr/proto/federation_pb2.py,sha256=strZ42K6S-50tuRVCqXqGcaLR6suXrGFT0SQOqNcpLQ,1974
155
+ flwr/proto/federation_pb2.pyi,sha256=mk1qfH85SURZWXGVpAzpPCgPTu3L4dlEefucG3lMyu8,3203
156
156
  flwr/proto/federation_pb2_grpc.py,sha256=HPErt9uXJPbY8jLtTNFr941z82uMm7cOx10hTHgcwZM,902
157
157
  flwr/proto/federation_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
158
158
  flwr/proto/fleet_pb2.py,sha256=HnxtM2pqVdn2xhl3e1NlLazpSMaGoUUEG9Nd17egxqU,6543
@@ -183,18 +183,18 @@ flwr/proto/recorddict_pb2.py,sha256=L2mNSyIVWA2dcI1xWI3gj0nktuDHYgxbbLuVRQKVU74,
183
183
  flwr/proto/recorddict_pb2.pyi,sha256=BYgVNk985Ww4dCXCjDGg1YU6q7MuMqbDa0usGVH3ktg,15208
184
184
  flwr/proto/recorddict_pb2_grpc.py,sha256=kw9_kXNcRe3y6j6HquG1P1MqccFFAogfi48djxbOLDE,902
185
185
  flwr/proto/recorddict_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
186
- flwr/proto/run_pb2.py,sha256=8tQDMyiBjw_-S6jiJpFd_-dDrMq9ZhyPyWwnmFu3qek,5101
187
- flwr/proto/run_pb2.pyi,sha256=t42qPzJTY1GVUUrkdIjdoPfAKlsXlUw9A8vBpwgbHsI,10852
186
+ flwr/proto/run_pb2.py,sha256=0HsPXXNxKq0uefBY3gJOBvu9gQGZ-FhKaGhJiAwMKgU,4146
187
+ flwr/proto/run_pb2.pyi,sha256=m6YeVUE2LnljsF_1FTpJWpxPEKw8RB_X1HuRFvijHG0,8689
188
188
  flwr/proto/run_pb2_grpc.py,sha256=l5u1Ww6JxVLVN784Z2OQbkQ-tAf5yYGh6QbNDc4F5II,895
189
189
  flwr/proto/run_pb2_grpc.pyi,sha256=fMwjLr-QCljWBa8uk0fvMCytnrF1-IzFLCbezqEmvdU,1071
190
- flwr/proto/serverappio_pb2.py,sha256=R-NbCzzkVKPKqnJQrlslBEGIw4PvvC3nwQkxkmsxrqA,4045
190
+ flwr/proto/serverappio_pb2.py,sha256=g4NlMFE4F3u0FXSmNJNGOe2nFRAaRRH8oEak6FSqeX8,3940
191
191
  flwr/proto/serverappio_pb2.pyi,sha256=KpVM8B_O0M3RFJ-DtnNlQapJs4V-7pHcdEb2G3ECbhE,1998
192
- flwr/proto/serverappio_pb2_grpc.py,sha256=UWium7vo4x6odOSJ-ymnsnEqGSrvVUvJO4xT37_EJ4k,32123
193
- flwr/proto/serverappio_pb2_grpc.pyi,sha256=Vr0BEZGmJOU_Xs0fJ0eijWmr8LqpnD-exrDC8kRJmRM,16310
194
- flwr/proto/simulationio_pb2.py,sha256=WZ7fqvwPdayfgH8UZPdkhQwMtEWcTm0t_h9a9srrSBQ,2787
192
+ flwr/proto/serverappio_pb2_grpc.py,sha256=CNLkE1rVU5TaJHC7XoWYwONyPcDwCq5t6sezceCZbIg,30319
193
+ flwr/proto/serverappio_pb2_grpc.pyi,sha256=-vpa_s5oGrT2aXE4zmIdDXXGxJ7ZSfcs8pIeOGvX7yE,15557
194
+ flwr/proto/simulationio_pb2.py,sha256=b7B2VXAwKcfgKPulDmOBQs0RvEWKnWbGuTwF4GvMnn8,2681
195
195
  flwr/proto/simulationio_pb2.pyi,sha256=OsUGEduv1iJCew8C4cMz87Y5uQAhHDmxNyVfwA4kXd8,824
196
- flwr/proto/simulationio_pb2_grpc.py,sha256=j37CCQNKDaTKXaFxm56MCR6UAIVF2zCH2hLO1sXbqWY,20994
197
- flwr/proto/simulationio_pb2_grpc.pyi,sha256=lN9HoAvnHX_IJmtMKswge5qyhdHc1wdi-k_IHbqEu9Q,11328
196
+ flwr/proto/simulationio_pb2_grpc.py,sha256=JVJ_u2RR64amAnacdH6op6eOW7CT0RAzZbRBfqPLBQk,19201
197
+ flwr/proto/simulationio_pb2_grpc.pyi,sha256=SHge7XK0FJoPsZzXBrVeagBUlmpRzMAiXDMaYkjB3eI,10614
198
198
  flwr/proto/transport_pb2.py,sha256=xqDF2oI0PzAndH17O80SQkyOT_QF9m7CQ0166He7UDQ,10122
199
199
  flwr/proto/transport_pb2.pyi,sha256=A-AzbyDAyp4hzJCuC6MOA1NewkFmtuhPwFCjPKqQP0Q,22450
200
200
  flwr/proto/transport_pb2_grpc.py,sha256=jYsbV3KYdp4TaNfWxv3ljFEvB-Yjsa8MIPtTH-vVPPk,3600
@@ -276,10 +276,10 @@ flwr/server/superlink/linkstate/sql_linkstate.py,sha256=ziZvpEQBVV9GSxjHiS0fAyaY
276
276
  flwr/server/superlink/linkstate/utils.py,sha256=IA1mKKhGVBPoD61VXKFa8dZ_prnfuyWIuKAeeHPLmuE,16000
277
277
  flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
278
278
  flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=2NFPynJMpYpT9C98Fr4n0QrTTjWBWbeUzlHcc6pg2kY,2279
279
- flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=EF306zWTfb-h4bie9ZKTZSRdgfLdJQVZ0Vbj5fw4keM,20252
279
+ flwr/server/superlink/serverappio/serverappio_servicer.py,sha256=sEdA8lQzNEKMdpvvwzCsJJWHdlkPI1omCs6XyAWKES0,19586
280
280
  flwr/server/superlink/simulation/__init__.py,sha256=Ry8DrNaZCMcQXvUc4FoCN2m3dvUQgWjasfp015o3Ec4,718
281
281
  flwr/server/superlink/simulation/simulationio_grpc.py,sha256=fHFW8SOR4iyfBxQeYOXWwqUStGsv0P4EAIVkBk69BN4,2174
282
- flwr/server/superlink/simulation/simulationio_servicer.py,sha256=140iEJZ0lCw0bWNI4B6VSvMXGz0bVUeaCnDW-372_zw,10161
282
+ flwr/server/superlink/simulation/simulationio_servicer.py,sha256=QghTkyaNrSR41HMwQPtWAqhv6kWqdoj44tuto1K5x6A,9558
283
283
  flwr/server/superlink/utils.py,sha256=pdeB9dm21e5D2Vuymme8069VWW5XuWZfi1LAm7nKjeQ,2400
284
284
  flwr/server/typing.py,sha256=qr04ihK3cARvw2Cz64axwzbdCbLtK8R5DDtlh5kWXEU,1020
285
285
  flwr/server/utils/__init__.py,sha256=U4gM84-uUFddarODDQkO6SjNUuGhFcsHJZMjSEbezkU,884
@@ -328,7 +328,7 @@ flwr/supercore/address.py,sha256=SgM_pazKsw1Avo5nms0WWgIZFUGS349O0gOP7N3bFW4,331
328
328
  flwr/supercore/app_utils.py,sha256=P558DOr5a4UPyOdRCxbDQueQF-L-kSc6qzouPPuqj0U,1773
329
329
  flwr/supercore/cli/__init__.py,sha256=EDl2aO-fuQfxSbL-T1W9RAfA2N0hpWHmqX_GSwblJbQ,845
330
330
  flwr/supercore/cli/flower_superexec.py,sha256=IQIGzxgaeLNMNzGXGemfYK3lp8God5bTkXpVkbeP_ig,6109
331
- flwr/supercore/constant.py,sha256=dvYHbb6EtDMc46OTwScaE8E4kf_rG43QhDDs_I8Uwg4,2925
331
+ flwr/supercore/constant.py,sha256=Hn87UDdFZBhVq2kbGziPoV2veozYZlJ3R_Unjmr7ekY,3008
332
332
  flwr/supercore/corestate/__init__.py,sha256=Vau6-L_JG5QzNqtCTa9xCKGGljc09wY8avZmIjSJemg,774
333
333
  flwr/supercore/corestate/corestate.py,sha256=EZg4gPXqVOXwS7t0tlPfedajoWj5T80oeDBNxpV2y2I,2874
334
334
  flwr/supercore/corestate/in_memory_corestate.py,sha256=9qa6RuRZfCp6vs-ARYdiZjCL31VOAAxw0a_VkBXR5zY,5116
@@ -351,7 +351,7 @@ flwr/supercore/object_store/__init__.py,sha256=cdfPAmjINY6iOp8oI_LdcVh2simg469Mk
351
351
  flwr/supercore/object_store/in_memory_object_store.py,sha256=-DU6n1Ef3EmllHY9SzeXw57ftoU0mR_6or4NIDSZlcs,9322
352
352
  flwr/supercore/object_store/object_store.py,sha256=XLo-xe258TmCel9dNLCJepFjXaQtEi0wBqzU9YsyJVg,5221
353
353
  flwr/supercore/object_store/object_store_factory.py,sha256=RByhm8Ow6TxmklP1MTluaze3v5kw0O1CILrA7Y0nWMg,2604
354
- flwr/supercore/object_store/sql_object_store.py,sha256=ZBmyc3a_GXZFNaefDCxhrri-_BgcQPOj7OtUfrPcjKo,10130
354
+ flwr/supercore/object_store/sql_object_store.py,sha256=z0zqPNwkx7tay3vFJ2Bd1Ddv3nWXBB3zcK-LP8ZfsbI,10349
355
355
  flwr/supercore/primitives/__init__.py,sha256=Tx8GOjnmMo8Y74RsDGrMpfr-E0Nl8dcUDF784_ge6F8,745
356
356
  flwr/supercore/primitives/asymmetric.py,sha256=1643niHYj3uEbfPd06VuMHwN3tKVwg0uVyR3RhTdWIU,3778
357
357
  flwr/supercore/primitives/asymmetric_ed25519.py,sha256=eIhOTMibQW0FJX4MXdplHdL3HcfCiKuFu2mQ8GQTUz8,5025
@@ -385,15 +385,15 @@ flwr/superlink/auth_plugin/__init__.py,sha256=ApYBHnDmtv5gVrnxdFq97zC58O1icqHogK
385
385
  flwr/superlink/auth_plugin/auth_plugin.py,sha256=xLqAYFG7sjAhYgyeTvvEY6fSMjPRq0offmTDRYpIs78,2956
386
386
  flwr/superlink/auth_plugin/noop_auth_plugin.py,sha256=0MWjNXZdz6zGRfitlnZfVKu4sKVn0HhJvnp09c3xVUA,2962
387
387
  flwr/superlink/federation/__init__.py,sha256=A1pFFvkEQrHzvRAOstr2o7nphx3JbuJgkNRFKJ9qD3M,890
388
- flwr/superlink/federation/federation_manager.py,sha256=-Vu1v_WWhWK7wgKEQua24lw9a6iPxG89VI-jqLO5E4g,2322
389
- flwr/superlink/federation/noop_federation_manager.py,sha256=WzUudE_irDqapua2lNCDrLwSgerlxLNCrgLo8rYbU2o,3004
388
+ flwr/superlink/federation/federation_manager.py,sha256=vpVaW-WS-mGAazxh9fy9Xp3gLPQozRsUoJiloG5_tBI,2354
389
+ flwr/superlink/federation/noop_federation_manager.py,sha256=LuBDncifAvcn8KszumZBmsp7-9PIp_5iHiHoPLahlBE,3149
390
390
  flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
391
391
  flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
392
392
  flwr/superlink/servicer/control/control_account_auth_interceptor.py,sha256=AJs7GE-fyUBLcUEUzB058TpFzC7gyDOL17THvYkJTn8,6529
393
393
  flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=r9LjF5VkrE1sZIcml-sO2uOPAwpvr6dj4tFchqoDcR4,5965
394
394
  flwr/superlink/servicer/control/control_grpc.py,sha256=AD7q2eo7RvXEhntcfVLgoKAR7AWfD_Z56Qw51wGLanY,4218
395
395
  flwr/superlink/servicer/control/control_license_interceptor.py,sha256=8d28soJ0mLLhpSGCpuY2YzgbX0vVO7Sqe2DcApEgILc,3336
396
- flwr/superlink/servicer/control/control_servicer.py,sha256=s9LgpbXUGU7DYwOvFUzNjgyKEWHyjPJQeUfp-XXUBWM,25523
396
+ flwr/superlink/servicer/control/control_servicer.py,sha256=7z4orYaoEO0Zm5JDtlvJ6TKBOO5cDy20ieloCZ0K8iU,25682
397
397
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
398
398
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
399
399
  flwr/supernode/cli/flower_supernode.py,sha256=LhciYbUwUfvkR4hiHxizERhQzpqZOAG9d6qVm6-V4jY,10891
@@ -403,12 +403,12 @@ flwr/supernode/nodestate/in_memory_nodestate.py,sha256=DBhpDsPmitkOr86pW78_0aiG_
403
403
  flwr/supernode/nodestate/nodestate.py,sha256=RWrsHS1nndK67-T6YSmi85qRb_t_wM7fjLb16YS-87Y,6217
404
404
  flwr/supernode/nodestate/nodestate_factory.py,sha256=i-1cv42R9LBM1nyasTHuTHSqlyJxVSRtUK2BMzqT-Ss,1631
405
405
  flwr/supernode/runtime/__init__.py,sha256=JQdqd2EMTn-ORMeTvewYYh52ls0YKP68jrps1qioxu4,718
406
- flwr/supernode/runtime/run_clientapp.py,sha256=NConr1VXKvK1iOOnKcYJpuqA97Hy8CCLzApOXbARsCo,9457
406
+ flwr/supernode/runtime/run_clientapp.py,sha256=cNcaOjgEXLNDFhfYS6auOcdsgj-nmwfuIwfoEtVDRpM,9385
407
407
  flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca8gxdEo,717
408
408
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
409
- flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=rRL4CQ0L78jF_p0ct4-JMGREt6wWRy__wy4czF4f54Y,11639
409
+ flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=5TOp0SelGqiWzRHfhYpoKzUd7EuVTqt5_PXvnUy7_Ok,11615
410
410
  flwr/supernode/start_client_internal.py,sha256=3MkeDiWZr-SsvACuuAxJi8nYw6GYNKOO6q8b36E3R9k,26250
411
- flwr_nightly-1.26.0.dev20260201.dist-info/METADATA,sha256=FBBYBlISXR4y-A2v4xpIkeyUzYIrk1VXdbv__inBD8I,14447
412
- flwr_nightly-1.26.0.dev20260201.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
413
- flwr_nightly-1.26.0.dev20260201.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
414
- flwr_nightly-1.26.0.dev20260201.dist-info/RECORD,,
411
+ flwr_nightly-1.26.0.dev20260203.dist-info/METADATA,sha256=HtDC4Sl-9R0f1NwHCNuXm4dulzTEou5G11nh6ximGBw,14447
412
+ flwr_nightly-1.26.0.dev20260203.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
413
+ flwr_nightly-1.26.0.dev20260203.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
414
+ flwr_nightly-1.26.0.dev20260203.dist-info/RECORD,,