flwr-nightly 1.22.0.dev20250915__py3-none-any.whl → 1.22.0.dev20250917__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 (37) hide show
  1. flwr/cli/app.py +2 -0
  2. flwr/cli/new/new.py +2 -2
  3. flwr/cli/new/templates/app/README.flowertune.md.tpl +1 -1
  4. flwr/cli/new/templates/app/code/client.baseline.py.tpl +64 -47
  5. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +56 -90
  6. flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +1 -23
  7. flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +37 -58
  8. flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +39 -44
  9. flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -14
  10. flwr/cli/new/templates/app/code/server.baseline.py.tpl +27 -29
  11. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +3 -3
  12. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  13. flwr/cli/pull.py +100 -0
  14. flwr/cli/utils.py +17 -0
  15. flwr/common/constant.py +2 -0
  16. flwr/proto/control_pb2.py +7 -3
  17. flwr/proto/control_pb2.pyi +24 -0
  18. flwr/proto/control_pb2_grpc.py +34 -0
  19. flwr/proto/control_pb2_grpc.pyi +13 -0
  20. flwr/server/app.py +13 -0
  21. flwr/serverapp/strategy/__init__.py +8 -0
  22. flwr/serverapp/strategy/fedavg.py +23 -2
  23. flwr/serverapp/strategy/fedavgm.py +198 -0
  24. flwr/serverapp/strategy/fedmedian.py +71 -0
  25. flwr/serverapp/strategy/fedprox.py +174 -0
  26. flwr/serverapp/strategy/fedtrimmedavg.py +176 -0
  27. flwr/serverapp/strategy/strategy_utils_tests.py +20 -1
  28. flwr/simulation/app.py +1 -1
  29. flwr/simulation/run_simulation.py +25 -30
  30. flwr/superlink/artifact_provider/__init__.py +22 -0
  31. flwr/superlink/artifact_provider/artifact_provider.py +37 -0
  32. flwr/superlink/servicer/control/control_grpc.py +3 -0
  33. flwr/superlink/servicer/control/control_servicer.py +59 -2
  34. {flwr_nightly-1.22.0.dev20250915.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/METADATA +6 -16
  35. {flwr_nightly-1.22.0.dev20250915.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/RECORD +37 -30
  36. {flwr_nightly-1.22.0.dev20250915.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/WHEEL +0 -0
  37. {flwr_nightly-1.22.0.dev20250915.dist-info → flwr_nightly-1.22.0.dev20250917.dist-info}/entry_points.txt +0 -0
@@ -143,6 +143,15 @@ def run_simulation_from_cli() -> None:
143
143
  run = Run.create_empty(run_id)
144
144
  run.override_config = override_config
145
145
 
146
+ # Create Context
147
+ server_app_context = Context(
148
+ run_id=run_id,
149
+ node_id=0,
150
+ node_config=UserConfig(),
151
+ state=RecordDict(),
152
+ run_config=fused_config,
153
+ )
154
+
146
155
  _ = _run_simulation(
147
156
  server_app_attr=server_app_attr,
148
157
  client_app_attr=client_app_attr,
@@ -153,7 +162,7 @@ def run_simulation_from_cli() -> None:
153
162
  run=run,
154
163
  enable_tf_gpu_growth=args.enable_tf_gpu_growth,
155
164
  verbose_logging=args.verbose,
156
- server_app_run_config=fused_config,
165
+ server_app_context=server_app_context,
157
166
  is_app=True,
158
167
  exit_event=EventType.CLI_FLOWER_SIMULATION_LEAVE,
159
168
  )
@@ -241,13 +250,12 @@ def run_simulation(
241
250
  def run_serverapp_th(
242
251
  server_app_attr: Optional[str],
243
252
  server_app: Optional[ServerApp],
244
- server_app_run_config: UserConfig,
253
+ server_app_context: Context,
245
254
  grid: Grid,
246
255
  app_dir: str,
247
256
  f_stop: threading.Event,
248
257
  has_exception: threading.Event,
249
258
  enable_tf_gpu_growth: bool,
250
- run_id: int,
251
259
  ctx_queue: "Queue[Context]",
252
260
  ) -> threading.Thread:
253
261
  """Run SeverApp in a thread."""
@@ -258,7 +266,6 @@ def run_serverapp_th(
258
266
  exception_event: threading.Event,
259
267
  _grid: Grid,
260
268
  _server_app_dir: str,
261
- _server_app_run_config: UserConfig,
262
269
  _server_app_attr: Optional[str],
263
270
  _server_app: Optional[ServerApp],
264
271
  _ctx_queue: "Queue[Context]",
@@ -272,19 +279,10 @@ def run_serverapp_th(
272
279
  log(INFO, "Enabling GPU growth for Tensorflow on the server thread.")
273
280
  enable_gpu_growth()
274
281
 
275
- # Initialize Context
276
- context = Context(
277
- run_id=run_id,
278
- node_id=0,
279
- node_config={},
280
- state=RecordDict(),
281
- run_config=_server_app_run_config,
282
- )
283
-
284
282
  # Run ServerApp
285
283
  updated_context = _run(
286
284
  grid=_grid,
287
- context=context,
285
+ context=server_app_context,
288
286
  server_app_dir=_server_app_dir,
289
287
  server_app_attr=_server_app_attr,
290
288
  loaded_server_app=_server_app,
@@ -310,7 +308,6 @@ def run_serverapp_th(
310
308
  has_exception,
311
309
  grid,
312
310
  app_dir,
313
- server_app_run_config,
314
311
  server_app_attr,
315
312
  server_app,
316
313
  ctx_queue,
@@ -335,7 +332,7 @@ def _main_loop(
335
332
  client_app_attr: Optional[str] = None,
336
333
  server_app: Optional[ServerApp] = None,
337
334
  server_app_attr: Optional[str] = None,
338
- server_app_run_config: Optional[UserConfig] = None,
335
+ server_app_context: Optional[Context] = None,
339
336
  ) -> Context:
340
337
  """Start ServerApp on a separate thread, then launch Simulation Engine."""
341
338
  # Initialize StateFactory
@@ -346,13 +343,15 @@ def _main_loop(
346
343
  server_app_thread_has_exception = threading.Event()
347
344
  serverapp_th = None
348
345
  success = True
349
- updated_context = Context(
350
- run_id=run.run_id,
351
- node_id=0,
352
- node_config=UserConfig(),
353
- state=RecordDict(),
354
- run_config=UserConfig(),
355
- )
346
+ if server_app_context is None:
347
+ server_app_context = Context(
348
+ run_id=run.run_id,
349
+ node_id=0,
350
+ node_config=UserConfig(),
351
+ state=RecordDict(),
352
+ run_config=UserConfig(),
353
+ )
354
+ updated_context = server_app_context
356
355
  try:
357
356
  # Register run
358
357
  log(DEBUG, "Pre-registering run with id %s", run.run_id)
@@ -361,9 +360,6 @@ def _main_loop(
361
360
  run.running_at = run.starting_at
362
361
  state_factory.state().run_ids[run.run_id] = RunRecord(run=run) # type: ignore
363
362
 
364
- if server_app_run_config is None:
365
- server_app_run_config = {}
366
-
367
363
  # Initialize Grid
368
364
  grid = InMemoryGrid(state_factory=state_factory)
369
365
  grid.set_run(run_id=run.run_id)
@@ -373,13 +369,12 @@ def _main_loop(
373
369
  serverapp_th = run_serverapp_th(
374
370
  server_app_attr=server_app_attr,
375
371
  server_app=server_app,
376
- server_app_run_config=server_app_run_config,
372
+ server_app_context=server_app_context,
377
373
  grid=grid,
378
374
  app_dir=app_dir,
379
375
  f_stop=f_stop,
380
376
  has_exception=server_app_thread_has_exception,
381
377
  enable_tf_gpu_growth=enable_tf_gpu_growth,
382
- run_id=run.run_id,
383
378
  ctx_queue=output_context_queue,
384
379
  )
385
380
 
@@ -438,7 +433,7 @@ def _run_simulation(
438
433
  backend_config: Optional[BackendConfig] = None,
439
434
  client_app_attr: Optional[str] = None,
440
435
  server_app_attr: Optional[str] = None,
441
- server_app_run_config: Optional[UserConfig] = None,
436
+ server_app_context: Optional[Context] = None,
442
437
  app_dir: str = "",
443
438
  flwr_dir: Optional[str] = None,
444
439
  run: Optional[Run] = None,
@@ -502,7 +497,7 @@ def _run_simulation(
502
497
  client_app_attr,
503
498
  server_app,
504
499
  server_app_attr,
505
- server_app_run_config,
500
+ server_app_context,
506
501
  )
507
502
  # Detect if there is an Asyncio event loop already running.
508
503
  # If yes, disable logger propagation. In environmnets
@@ -0,0 +1,22 @@
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
+ """ArtifactProvider for SuperLink."""
16
+
17
+
18
+ from .artifact_provider import ArtifactProvider
19
+
20
+ __all__ = [
21
+ "ArtifactProvider",
22
+ ]
@@ -0,0 +1,37 @@
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
+ """Abstract base class for ArtifactProvider."""
16
+
17
+
18
+ from abc import ABC, abstractmethod
19
+ from typing import Optional
20
+
21
+
22
+ class ArtifactProvider(ABC):
23
+ """ArtifactProvider interface for providing artifact download links."""
24
+
25
+ @abstractmethod
26
+ def get_url(self, run_id: int) -> Optional[str]:
27
+ """Return the artifact download link for the given run ID."""
28
+
29
+ @property
30
+ @abstractmethod
31
+ def output_dir(self) -> str:
32
+ """Permanent storage directory."""
33
+
34
+ @property
35
+ @abstractmethod
36
+ def tmp_dir(self) -> str:
37
+ """Temporary storage directory."""
@@ -31,6 +31,7 @@ from flwr.server.superlink.linkstate import LinkStateFactory
31
31
  from flwr.supercore.ffs import FfsFactory
32
32
  from flwr.supercore.license_plugin import LicensePlugin
33
33
  from flwr.supercore.object_store import ObjectStoreFactory
34
+ from flwr.superlink.artifact_provider import ArtifactProvider
34
35
 
35
36
  from .control_event_log_interceptor import ControlEventLogInterceptor
36
37
  from .control_license_interceptor import ControlLicenseInterceptor
@@ -56,6 +57,7 @@ def run_control_api_grpc(
56
57
  auth_plugin: Optional[ControlAuthPlugin] = None,
57
58
  authz_plugin: Optional[ControlAuthzPlugin] = None,
58
59
  event_log_plugin: Optional[EventLogWriterPlugin] = None,
60
+ artifact_provider: Optional[ArtifactProvider] = None,
59
61
  ) -> grpc.Server:
60
62
  """Run Control API (gRPC, request-response)."""
61
63
  license_plugin: Optional[LicensePlugin] = get_license_plugin()
@@ -68,6 +70,7 @@ def run_control_api_grpc(
68
70
  objectstore_factory=objectstore_factory,
69
71
  is_simulation=is_simulation,
70
72
  auth_plugin=auth_plugin,
73
+ artifact_provider=artifact_provider,
71
74
  )
72
75
  interceptors: list[grpc.ServerInterceptor] = []
73
76
  if license_plugin is not None:
@@ -29,7 +29,9 @@ from flwr.common.auth_plugin import ControlAuthPlugin
29
29
  from flwr.common.constant import (
30
30
  FAB_MAX_SIZE,
31
31
  LOG_STREAM_INTERVAL,
32
+ NO_ARTIFACT_PROVIDER_MESSAGE,
32
33
  NO_USER_AUTH_MESSAGE,
34
+ PULL_UNFINISHED_RUN_MESSAGE,
33
35
  RUN_ID_NOT_FOUND_MESSAGE,
34
36
  Status,
35
37
  SubStatus,
@@ -49,6 +51,8 @@ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
49
51
  GetLoginDetailsResponse,
50
52
  ListRunsRequest,
51
53
  ListRunsResponse,
54
+ PullArtifactsRequest,
55
+ PullArtifactsResponse,
52
56
  StartRunRequest,
53
57
  StartRunResponse,
54
58
  StopRunRequest,
@@ -59,6 +63,7 @@ from flwr.proto.control_pb2 import ( # pylint: disable=E0611
59
63
  from flwr.server.superlink.linkstate import LinkState, LinkStateFactory
60
64
  from flwr.supercore.ffs import FfsFactory
61
65
  from flwr.supercore.object_store import ObjectStore, ObjectStoreFactory
66
+ from flwr.superlink.artifact_provider import ArtifactProvider
62
67
 
63
68
  from .control_user_auth_interceptor import shared_account_info
64
69
 
@@ -73,14 +78,16 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
73
78
  objectstore_factory: ObjectStoreFactory,
74
79
  is_simulation: bool,
75
80
  auth_plugin: Optional[ControlAuthPlugin] = None,
81
+ artifact_provider: Optional[ArtifactProvider] = None,
76
82
  ) -> None:
77
83
  self.linkstate_factory = linkstate_factory
78
84
  self.ffs_factory = ffs_factory
79
85
  self.objectstore_factory = objectstore_factory
80
86
  self.is_simulation = is_simulation
81
87
  self.auth_plugin = auth_plugin
88
+ self.artifact_provider = artifact_provider
82
89
 
83
- def StartRun(
90
+ def StartRun( # pylint: disable=too-many-locals
84
91
  self, request: StartRunRequest, context: grpc.ServicerContext
85
92
  ) -> StartRunResponse:
86
93
  """Create run ID."""
@@ -126,11 +133,20 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
126
133
  flwr_aid,
127
134
  )
128
135
 
136
+ # Initialize node config
137
+ node_config = {}
138
+ if self.artifact_provider is not None:
139
+ node_config = {
140
+ "output_dir": self.artifact_provider.output_dir,
141
+ "tmp_dir": self.artifact_provider.tmp_dir,
142
+ }
143
+
129
144
  # Create an empty context for the Run
130
145
  context = Context(
131
146
  run_id=run_id,
132
147
  node_id=0,
133
- node_config={},
148
+ # Dict is invariant in mypy
149
+ node_config=node_config, # type: ignore[arg-type]
134
150
  state=RecordDict(),
135
151
  run_config={},
136
152
  )
@@ -335,6 +351,47 @@ class ControlServicer(control_pb2_grpc.ControlServicer):
335
351
  refresh_token=credentials.refresh_token,
336
352
  )
337
353
 
354
+ def PullArtifacts(
355
+ self, request: PullArtifactsRequest, context: grpc.ServicerContext
356
+ ) -> PullArtifactsResponse:
357
+ """Pull artifacts for a given run ID."""
358
+ log(INFO, "ControlServicer.PullArtifacts")
359
+
360
+ # Check if artifact provider is configured
361
+ if self.artifact_provider is None:
362
+ context.abort(
363
+ grpc.StatusCode.UNIMPLEMENTED,
364
+ NO_ARTIFACT_PROVIDER_MESSAGE,
365
+ )
366
+ raise grpc.RpcError() # This line is unreachable
367
+
368
+ # Init link state
369
+ state = self.linkstate_factory.state()
370
+
371
+ # Retrieve run ID and run
372
+ run_id = request.run_id
373
+ run = state.get_run(run_id)
374
+
375
+ # Exit if `run_id` not found
376
+ if not run:
377
+ context.abort(grpc.StatusCode.NOT_FOUND, RUN_ID_NOT_FOUND_MESSAGE)
378
+ raise grpc.RpcError() # This line is unreachable
379
+
380
+ # Exit if the run is not finished yet
381
+ if run.status.status != Status.FINISHED:
382
+ context.abort(
383
+ grpc.StatusCode.FAILED_PRECONDITION, PULL_UNFINISHED_RUN_MESSAGE
384
+ )
385
+
386
+ # Check if `flwr_aid` matches the run's `flwr_aid` when user auth is enabled
387
+ if self.auth_plugin:
388
+ flwr_aid = shared_account_info.get().flwr_aid
389
+ _check_flwr_aid_in_run(flwr_aid=flwr_aid, run=run, context=context)
390
+
391
+ # Call artifact provider
392
+ download_url = self.artifact_provider.get_url(run_id)
393
+ return PullArtifactsResponse(url=download_url)
394
+
338
395
 
339
396
  def _create_list_runs_response(
340
397
  run_ids: set[int], state: LinkState, store: ObjectStore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: flwr-nightly
3
- Version: 1.22.0.dev20250915
3
+ Version: 1.22.0.dev20250917
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
@@ -102,25 +102,15 @@ Meet the Flower community on [flower.ai](https://flower.ai)!
102
102
 
103
103
  Flower's goal is to make federated learning accessible to everyone. This series of tutorials introduces the fundamentals of federated learning and how to implement them in Flower.
104
104
 
105
- 0. **What is Federated Learning?**
105
+ 0. **[What is Federated Learning?](https://flower.ai/docs/framework/main/en/tutorial-series-what-is-federated-learning.html)**
106
106
 
107
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-what-is-federated-learning.ipynb))
107
+ 1. **[An Introduction to Federated Learning](https://flower.ai/docs/framework/main/en/tutorial-series-get-started-with-flower-pytorch.html)**
108
108
 
109
- 1. **An Introduction to Federated Learning**
109
+ 2. **[Using Strategies in Federated Learning](https://flower.ai/docs/framework/main/en/tutorial-series-use-a-federated-learning-strategy-pytorch.html)**
110
110
 
111
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
111
+ 3. **[Customize a Flower Strategy](https://flower.ai/docs/framework/main/en/tutorial-series-build-a-strategy-from-scratch-pytorch.html)**
112
112
 
113
- 2. **Using Strategies in Federated Learning**
114
-
115
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
116
-
117
- 3. **Building Strategies for Federated Learning**
118
-
119
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
120
-
121
- 4. **Custom Clients for Federated Learning**
122
-
123
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/framework/docs/source/tutorial-series-customize-the-client-pytorch.ipynb))
113
+ 4. **[Communicate Custom Messages](https://flower.ai/docs/framework/main/en/tutorial-series-customize-the-client-pytorch.html)**
124
114
 
125
115
  Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
126
116
 
@@ -4,7 +4,7 @@ flwr/app/error.py,sha256=0PwA-E_CAs5P_nWAA0kksVO1A44t4CNLEf7u-Su-uJ0,2342
4
4
  flwr/app/exception.py,sha256=WX45Yviu_CmYrYd8JHNjRkSsb-g4Br7XvVLKuVxwSdI,1298
5
5
  flwr/app/metadata.py,sha256=rdMBn0zhIOYmCvmGENQWSQqDwcxwsMJzCle4PQdlc_Y,7331
6
6
  flwr/cli/__init__.py,sha256=EfMGmHoobET6P2blBt_eOByXL8299MgFfB7XNdaPQ6I,720
7
- flwr/cli/app.py,sha256=AKCP45Dkbpvdil_4Ir9S93L3HP3iUOnHmcZjscoM8uU,1856
7
+ flwr/cli/app.py,sha256=qYMZtPXzDXZpigmerRz4WF3lA3D0Y1lVufzgWB8Nd9A,1899
8
8
  flwr/cli/auth_plugin/__init__.py,sha256=FyaoqPzcxlBTFfJ2sBRC5USwQLmAhFr5KuBwfMO4bmo,1052
9
9
  flwr/cli/auth_plugin/oidc_cli_plugin.py,sha256=kQteGRB9-DmC7K5F9TBmUc8ndSBR7WyT27ygWUUuX_g,5402
10
10
  flwr/cli/build.py,sha256=hE54Q_eMdWLpVKSVC2aQaUxVaiUlWnAosGNvIPSEg6Y,7284
@@ -18,19 +18,19 @@ flwr/cli/login/__init__.py,sha256=B1SXKU3HCQhWfFDMJhlC7FOl8UsvH4mxysxeBnrfyUE,80
18
18
  flwr/cli/login/login.py,sha256=RM1Jiv_VFm3oz4rTHSr3D87X90lW3WzErjBBU7WviWY,4309
19
19
  flwr/cli/ls.py,sha256=3YK7cpoImJ7PbjlP_JgYRQWz1GymX2q7Reu-mKJEpao,10957
20
20
  flwr/cli/new/__init__.py,sha256=QA1E2QtzPvFCjLTUHnFnJbufuFiGyT_0Y53Wpbvg1F0,790
21
- flwr/cli/new/new.py,sha256=KyTs9Fbm4eoJ5DohhuTkYNJJX5rDC0p-YTPtNatYXrI,10529
21
+ flwr/cli/new/new.py,sha256=GvXapfYMrUQMktn1qJ3bfxfXeK0IAsxsxHBIGfPg3sE,10535
22
22
  flwr/cli/new/templates/__init__.py,sha256=FpjWCfIySU2DB4kh0HOXLAjlZNNFDTVU4w3HoE2TzcI,725
23
23
  flwr/cli/new/templates/app/.gitignore.tpl,sha256=HZJcGQoxp7aUzaPg8Uqch3kNrIESwr9yjimDxJYgXVY,3104
24
24
  flwr/cli/new/templates/app/LICENSE.tpl,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
25
25
  flwr/cli/new/templates/app/README.baseline.md.tpl,sha256=oClo5eR0iLuPzBT7uS3ikhNRAnySz_lhkHFElixKyJM,9640
26
- flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=sZFKxfvWvCopsTA_z0w5mvwepP0ksVslr5R-43SRBAI,3492
26
+ flwr/cli/new/templates/app/README.flowertune.md.tpl,sha256=2-W0HAseLWOe1JJU0TsNocp63D14N7jLwWhtYjxlfxs,3494
27
27
  flwr/cli/new/templates/app/README.md.tpl,sha256=uI8vUMCEGA1-WJ8-9EUFCnNtofWFkJNOxaR1V6r_Su4,1908
28
28
  flwr/cli/new/templates/app/__init__.py,sha256=LbR0ksGiF566JcHM_H5m1Tc4-oYUEilWFlcXR-Oe6bI,729
29
29
  flwr/cli/new/templates/app/code/__init__.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
30
30
  flwr/cli/new/templates/app/code/__init__.py,sha256=zXa2YU1swzHxOKDQbwlDMEwVPOUswVeosjkiXNMTgFo,736
31
31
  flwr/cli/new/templates/app/code/__init__.py.tpl,sha256=J0Gn74E7khpLyKJVNqOPu7ev93vkcu1PZugsbxtABMw,52
32
32
  flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl,sha256=mKIS8MK_X8T9NlmcX1-_c9Bbexc-ueqDIBI7uN6c4dE,45
33
- flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=IYlCZqnaxT2ucP1ReffRNohOkYwNrhtrnDoQBBcrThY,1901
33
+ flwr/cli/new/templates/app/code/client.baseline.py.tpl,sha256=w8xYWhVAb5AFDLj206Nxz5U-xbzDBv0px2FFvE5wRTM,2438
34
34
  flwr/cli/new/templates/app/code/client.huggingface.py.tpl,sha256=SIZZ3s-6u8IU8cFfsqu6ZU8zjhfI1m1SWauOSUcW8TA,3015
35
35
  flwr/cli/new/templates/app/code/client.jax.py.tpl,sha256=uFCIPwAHYiRAgh2W3nRni_Oig02ZzRF-ofUG5O19zcE,2125
36
36
  flwr/cli/new/templates/app/code/client.mlx.py.tpl,sha256=CHU2IBIzI2YENZZuvTsAlSdL94DK19wMYMIhr-JgwZ8,3422
@@ -41,13 +41,13 @@ flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=0qqEe-RRjkHGOH8gsD9
41
41
  flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=8o55KXpsbF_rv6o98ZNYJDCazjwMp_RPTaSzDfT7Qlw,2682
42
42
  flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
43
43
  flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=Xq5fEn5yZkw6HAJi10T_3HRBoqN5_5pNqJHY4wXvD5k,748
44
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=vJ-cbxwaNmDr9eDAVINy_qUJzA2FirSXKsrkUnlFWYU,3759
44
+ flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=p6BzTbP-mXkFANiVC7iz3YlskOidWaLC341IJyrUotQ,2951
45
45
  flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=1NA2Sf-EviNtOaYN4dnFk6v2tcZVsY3-eXY84wOXVng,3059
46
- flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=ONJw_BgBWEofVNGRDu8KAIThb8saRQlUEK4uS2u_6To,2449
47
- flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=xkmmBKr0oGmewP56SP3s_6FG6JOVlGlquhg3a9nYMis,3270
48
- flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=BhiqRg9w1MGuU5h2_vrLhRc0oHItYzE69qX_JI411k8,2754
49
- flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=zJklLwH4vPx7rruzhzbAGdInxjjJw-djHCuCx5wshVA,2575
50
- flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=rBB-DKEuA2SG1DGLW8uSHUg-GydEgb-7NHEclsC2X2g,1539
46
+ flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=UCLEKUpXarkz9tMFtDrxmLv6QuKe5zCimTuoopQedUM,1717
47
+ flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=qe9Om3P2ERvvSj2NN5RSEKgNgztWatCpWtC8SkS_T_M,2420
48
+ flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl,sha256=M6CzBY-gtIqLOu2xTtABXOVgBnqKOu7d6Vn2sazmYuI,2444
49
+ flwr/cli/new/templates/app/code/model.baseline.py.tpl,sha256=P6jTuN9reJfdthiN3mOUHiA4xrtDh5TTUcAV6210-hU,2104
50
+ flwr/cli/new/templates/app/code/server.baseline.py.tpl,sha256=hliBSfHSzg4bi6PxMlj4oGFfvzvi-4DzoaI67VZbJeQ,1111
51
51
  flwr/cli/new/templates/app/code/server.huggingface.py.tpl,sha256=_2Mv-SqGSMf7sMdbMEmvROzedvNaVHvhIIO3eYAhVYU,1252
52
52
  flwr/cli/new/templates/app/code/server.jax.py.tpl,sha256=RW-rh7ogcJ3_BD66bJxTw-ZoP7c-4SK8hVHc-e0SSVY,1029
53
53
  flwr/cli/new/templates/app/code/server.mlx.py.tpl,sha256=J8rIe6RL2ndODVJD79xShRKBH70HljFSCi4s_RJ-xLQ,1200
@@ -66,8 +66,8 @@ flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl,sha256=XlJqA4Ix_P
66
66
  flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=vHdhtMp0FHxbYafXyhDT9aKmmmA0Jvpx5Oum1Yu9lWY,1850
67
67
  flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=impgWN7MfztmcWF4xh1llcZGsgTvrb1HD5ZE0t-8U08,1731
68
68
  flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
69
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=eoRhBN5n00LQu2y4o29JUw3T03CasO5S1HMxHrnyWWQ,3180
70
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=oVq52gXoPT69jHji75FSOYZ978xwIG-AVCha-LyuG7k,2497
69
+ flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=mPIMPfneVYV03l8jWRgWZ0V5Kh_pJw-AMUvkhcKkmL8,3182
70
+ flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=wqYW4bWcf12m0U2njR995lySSesFvnHB-eSkPWz-QdM,2501
71
71
  flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=xHGF38i7oFpvnFvqfqLdtc08CkHRYsenbLz3q1dhCXk,2020
72
72
  flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=fdDhwmPoMirJ095cU_vFCBf0ILQlAoa1fdnHb2LM1yk,1471
73
73
  flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=PAjPT2v06sBZxacNiyMJloDwocCK5tFcGQmMXOoBqc8,1542
@@ -76,10 +76,11 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=SE4H23OFkQbqNU64nYf
76
76
  flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl,sha256=docQbs3MuRR-yT24lVz7N2sQL3Sj49EHuOCuRj_0djQ,1508
77
77
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=apauU_PUmLEbt2rjckKniEbzdRs1EnMri_qgtHtBJZ8,1484
78
78
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=LQpDKJTEnRKj5Ygn5FkT44SxlnLVprkPlbrGaFf5Q50,1508
79
+ flwr/cli/pull.py,sha256=dHiMe6x8w8yRoFNKpjA-eiPD6eFiHz4Vah5HZrqNpuo,3364
79
80
  flwr/cli/run/__init__.py,sha256=RPyB7KbYTFl6YRiilCch6oezxrLQrl1kijV7BMGkLbA,790
80
81
  flwr/cli/run/run.py,sha256=ECa0kup9dn15O70H74QdgUsEaeErbzDqVX_U0zZO5IM,8173
81
82
  flwr/cli/stop.py,sha256=TR9F61suTxNUzGIktUdoBhXwdRtCdvzGhy3qCuvcfBg,5000
82
- flwr/cli/utils.py,sha256=tTI8PyJdA8BU1PoTS8ZItdCM5EVTeze_Z1zumffYY6A,12963
83
+ flwr/cli/utils.py,sha256=sMctnDYHv-zu9FG67aV0vy_zs3gkkXclQicBD_67WWg,13805
83
84
  flwr/client/__init__.py,sha256=boIhKaK6I977zrILmoTutNx94x5jB0e6F1gnAjaRJnI,1250
84
85
  flwr/client/client.py,sha256=3HAchxvknKG9jYbB7swNyDj-e5vUWDuMKoLvbT7jCVM,7895
85
86
  flwr/client/client_app.py,sha256=zVhi-l3chAb06ozFsKwix3hU_RpOLjST13Ha50AVIPE,16918
@@ -116,7 +117,7 @@ flwr/common/args.py,sha256=Nq2u4yePbkSY0CWFamn0hZY6Rms8G1xYDeDGIcLIITE,5849
116
117
  flwr/common/auth_plugin/__init__.py,sha256=DktrRcGZrRarLf7Jb_UlHtOyLp9_-kEplyq6PS5-vOA,988
117
118
  flwr/common/auth_plugin/auth_plugin.py,sha256=mM7SuphO4OsVAVJR1GErYVgYT83ZjxDzS_gha12bT9E,4855
118
119
  flwr/common/config.py,sha256=glcZDjco-amw1YfQcYTFJ4S1pt9APoexT-mf1QscuHs,13960
119
- flwr/common/constant.py,sha256=FXG5HqwQG-mQXgfptHn4jTaXD4Y_kyDA1ntTKcp0qfs,8850
120
+ flwr/common/constant.py,sha256=zopMTlEgz8TxMSh59ueef6VutHSdfb3XRStl1W5yBZ4,9013
120
121
  flwr/common/context.py,sha256=Be8obQR_OvEDy1OmshuUKxGRQ7Qx89mf5F4xlhkR10s,2407
121
122
  flwr/common/date.py,sha256=1ZT2cRSpC2DJqprOVTLXYCR_O2_OZR0zXO_brJ3LqWc,1554
122
123
  flwr/common/differential_privacy.py,sha256=FdlpdpPl_H_2HJa8CQM1iCUGBBQ5Dc8CzxmHERM-EoE,6148
@@ -181,10 +182,10 @@ flwr/proto/clientappio_pb2.py,sha256=vJjzwWydhg7LruK8cvRAeVQeHPsJztgdIW9nyiPBZF0
181
182
  flwr/proto/clientappio_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
182
183
  flwr/proto/clientappio_pb2_grpc.py,sha256=iobNROP0qvn5zddx7k-uIi_dJWP3T_BRp_kbKq086i8,17550
183
184
  flwr/proto/clientappio_pb2_grpc.pyi,sha256=Ytf1O1ktKB0Vsuc3AWLIErGjIJYokzKYzi2uA7mdMeg,4785
184
- flwr/proto/control_pb2.py,sha256=Jd_KT0Vi2GRf1rHDERxAsNmQxjLsNEmpqNLYdZ1kFCk,5684
185
- flwr/proto/control_pb2.pyi,sha256=oEQH84BwhgaiD5zIseGH_UujuMk2SVCe5R75msEga-8,9478
186
- flwr/proto/control_pb2_grpc.py,sha256=AweEk-n77uEwV1DX1lc55mhNlSfDEqsDHHWeouyTOVc,10610
187
- flwr/proto/control_pb2_grpc.pyi,sha256=8bROIwDXNlPzbpaBcxTwIzKXGTP18dvU8xBVKrfe80s,3001
185
+ flwr/proto/control_pb2.py,sha256=Sz7PTdb7YGBs2N-FX6GiOVueY9PN0cF85XbwBkK9_BE,6183
186
+ flwr/proto/control_pb2.pyi,sha256=2OLPt6ztVcLzzISqfRqW4yrA-nawIPLwVDoTjBnSS5U,10592
187
+ flwr/proto/control_pb2_grpc.py,sha256=R4ykPqGblqEpOdVskoSfMeS-pZdyMT3CMBQUtTzHbgQ,12282
188
+ flwr/proto/control_pb2_grpc.pyi,sha256=7U9aOP4dYamnc4ZtTrEQEYYz0kFNI_fT88LRxwClA0U,3504
188
189
  flwr/proto/error_pb2.py,sha256=PQVWrfjVPo88ql_KgV9nCxyQNCcV9PVfmcw7sOzTMro,1084
189
190
  flwr/proto/error_pb2.pyi,sha256=ZNH4HhJTU_KfMXlyCeg8FwU-fcUYxTqEmoJPtWtHikc,734
190
191
  flwr/proto/error_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -239,7 +240,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
239
240
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
240
241
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
242
  flwr/server/__init__.py,sha256=LQQHiuL2jy7TpNaKastRdGsexlxSt5ZWAQNVqitDnrY,1598
242
- flwr/server/app.py,sha256=BYFMIpzD7ZbxW9xMhW3mJ2Ojw0E71vITS3QKf6Bse3I,29286
243
+ flwr/server/app.py,sha256=SUWdNUcl-Sy8h2MiC8Etr50GDJuGq58Ekqtr5XQ-Xrg,29951
243
244
  flwr/server/client_manager.py,sha256=5jCGavVli7XdupvWWo7ru3PdFTlRU8IGvHFSSoUVLRs,6227
244
245
  flwr/server/client_proxy.py,sha256=sv0E9AldBYOvc3pusqFh-GnyreeMfsXQ1cuTtxTq_wY,2399
245
246
  flwr/server/compat/__init__.py,sha256=0IsttWvY15qO98_1GyzVC-vR1e_ZPXOdu2qUlOkYMPE,886
@@ -332,26 +333,30 @@ flwr/server/workflow/secure_aggregation/secaggplus_workflow.py,sha256=DkayCsnlAy
332
333
  flwr/serverapp/__init__.py,sha256=ZujKNXULwhWYQhFnxOOT5Wi9MRq2JCWFhAAj7ouiQ78,884
333
334
  flwr/serverapp/dp_fixed_clipping.py,sha256=wbP4W7CaUHXdll8ZSVUnTBSEWrnWM00CGk63rOR-Q2s,12133
334
335
  flwr/serverapp/exception.py,sha256=5cuH-2AafvihzosWDdDjuMmHdDqZ1XxHvCqZXNBVklw,1334
335
- flwr/serverapp/strategy/__init__.py,sha256=0ldxlooz4a5yewUbQJGVrW9awrrIcFDIrNR4yZgpfKw,1292
336
+ flwr/serverapp/strategy/__init__.py,sha256=MJNWeBWzpQDfqhhpND5LncxPVK91kUo_Yzu6IMFdLCc,1492
336
337
  flwr/serverapp/strategy/dp_fixed_clipping.py,sha256=wbP4W7CaUHXdll8ZSVUnTBSEWrnWM00CGk63rOR-Q2s,12133
337
338
  flwr/serverapp/strategy/fedadagrad.py,sha256=fD65P6OEERa_pxq847e1UZpA083AcWR44XavYB0naGM,6343
338
339
  flwr/serverapp/strategy/fedadam.py,sha256=s3xPIqhopy6yPTeFxevSPnc7a6BcKnKsvo2AaO6Z_xs,7138
339
- flwr/serverapp/strategy/fedavg.py,sha256=53L06lZLkbGV0TRZrUWvPaocvFTT1PAhTvu9UkKq1zE,11294
340
+ flwr/serverapp/strategy/fedavg.py,sha256=Bq_nlmngzJbjqX1fF1mevXGVN6-pwglHv-6yNrs6lkA,12035
341
+ flwr/serverapp/strategy/fedavgm.py,sha256=VlByltWzUYCoiVIWPFRqsqLKNWjlOlO2INK8SUxEjzk,8327
342
+ flwr/serverapp/strategy/fedmedian.py,sha256=b31Dk0LQBbQxi_f-jeSbWHI7iOBugcuBSN2Az-_a75E,2596
340
343
  flwr/serverapp/strategy/fedopt.py,sha256=kqT0uV2IUE93O72XEVa1JJo61dcwbZEoT9KmYTjR2tE,8477
344
+ flwr/serverapp/strategy/fedprox.py,sha256=XkkLTk3XpXAj0QoAzHqAvcAlPjrNlX11ISAu5u2x6X8,7026
345
+ flwr/serverapp/strategy/fedtrimmedavg.py,sha256=4-QxgAQGo_7vB_L7qDYy28d95OBt9MeDa92yaTRMHqk,7166
341
346
  flwr/serverapp/strategy/fedxgb_bagging.py,sha256=ktDjzov4y0BRecioq788umCEtcuwElou9olBizQKOnM,3282
342
347
  flwr/serverapp/strategy/fedyogi.py,sha256=1Ripr4Hi2cdeTOLiFOXtMKvOxR3BsUQwc7bbTrXN4LM,6653
343
348
  flwr/serverapp/strategy/result.py,sha256=E0Hl2VLnZAgQJjE2GDoKsK7JX-kPPU2KXc47Axt6hGw,4295
344
349
  flwr/serverapp/strategy/strategy.py,sha256=8uJGGm1ROLZERQ_dkRS7Z_rs-yK6XCE0UxXtIdFiEWk,10789
345
350
  flwr/serverapp/strategy/strategy_utils.py,sha256=hiwS7k-Hx6_c4NZXoKpHucS5CBKb7f8GppXRBSMt3Us,10851
346
- flwr/serverapp/strategy/strategy_utils_tests.py,sha256=o32XHujd9PLCB-YZMI2AttWLlvUXHe9yuxgiCrCkpgU,10209
351
+ flwr/serverapp/strategy/strategy_utils_tests.py,sha256=_adS23Lrv1QA6V_3oZ7P_csMd8RqDObFeIhOkFnNtTg,10690
347
352
  flwr/simulation/__init__.py,sha256=Gg6OsP1Z-ixc3-xxzvl7j7rz2Fijy9rzyEPpxgAQCeM,1556
348
- flwr/simulation/app.py,sha256=LbGLMvN9Ap119yBqsUcNNmVLRnCySnr4VechqcQ1hpA,10401
353
+ flwr/simulation/app.py,sha256=b_bDyZFwBf2zpKs37Vmd5cFJSzDRE0fL-8uqA0UkAv4,10393
349
354
  flwr/simulation/legacy_app.py,sha256=nMISQqW0otJL1-2Kfd94O6BLlGS2IEmEPKTM2WGKrIs,15861
350
355
  flwr/simulation/ray_transport/__init__.py,sha256=ogd-0AMv2U-wBZ1r3sHWaDIOIrVqr88Xi6C8o4Dviy0,734
351
356
  flwr/simulation/ray_transport/ray_actor.py,sha256=JN3xTqFIr5Z750k92CcA_uavzOHhSWDwE2WCaecvpks,19147
352
357
  flwr/simulation/ray_transport/ray_client_proxy.py,sha256=2kVUDrJe2ViOJEuB0v_Xb3XUwK9yKNwDwrYQXTJDdco,7506
353
358
  flwr/simulation/ray_transport/utils.py,sha256=KrexpWYCF-dAF3UHc9yDbPQWO-ahMT-BbD8nURLgiHk,2393
354
- flwr/simulation/run_simulation.py,sha256=-sp3dNZcp7MCAH0BlmZpVcFAGvozRdYXRdDYcH_2Zxk,20838
359
+ flwr/simulation/run_simulation.py,sha256=LrM5iI0Rf_QqrnqvJ1muKxKFlrInA3I8-SF-uIIsPik,20666
355
360
  flwr/simulation/simulationio_connection.py,sha256=mzS1C6EEREwQDPceDo30anAasmTDLb9qqV2tXlBhOUA,3494
356
361
  flwr/supercore/__init__.py,sha256=pqkFoow_E6UhbBlhmoD1gmTH-33yJRhBsIZqxRPFZ7U,755
357
362
  flwr/supercore/app_utils.py,sha256=K76Zt6R670b1hUmxOsNc1WUCVYvF7lejXPcCO9K0Q0g,1753
@@ -383,12 +388,14 @@ flwr/supercore/superexec/plugin/simulation_exec_plugin.py,sha256=upn5zE-YKkl_jTw
383
388
  flwr/supercore/superexec/run_superexec.py,sha256=8hUlaVPVNnhePQ9OUgen4yy0fSGZAVggBGzm-33iJPw,6630
384
389
  flwr/supercore/utils.py,sha256=ebuHMbeA8eXisX0oMPqBK3hk7uVnIE_yiqWVz8YbkpQ,1324
385
390
  flwr/superlink/__init__.py,sha256=GNSuJ4-N6Z8wun2iZNlXqENt5beUyzC0Gi_tN396bbM,707
391
+ flwr/superlink/artifact_provider/__init__.py,sha256=pgZEcVPKRE874LSu3cgy0HbwSJBIpVy_HxQOmne4PAs,810
392
+ flwr/superlink/artifact_provider/artifact_provider.py,sha256=Gnlg2M2SOqCruji2B0U3ov68NJWKin9scmnWJTiSnNA,1267
386
393
  flwr/superlink/servicer/__init__.py,sha256=ZC-kILcUGeh6IxJsfu24cTzUqIGXmQfEKsGfhsnhBpM,717
387
394
  flwr/superlink/servicer/control/__init__.py,sha256=qhUTMt_Mg4lxslCJYn5hDSrA-lXf5ya3617BT8kR-2Y,803
388
395
  flwr/superlink/servicer/control/control_event_log_interceptor.py,sha256=HauUd7Xq-b1TFZmZVl9wpBITfDttn8-1_KhlEq-HJ8M,5966
389
- flwr/superlink/servicer/control/control_grpc.py,sha256=DUGArJvH3oZasutEU55NtYm0ZukPEO92UKhzOGu3qu8,4079
396
+ flwr/superlink/servicer/control/control_grpc.py,sha256=BYm2QELbUAV_mHr0K-ZU726jjgoFXTo4M0-C6MXFzTg,4244
390
397
  flwr/superlink/servicer/control/control_license_interceptor.py,sha256=T3AzmRt-PPwyTq3hrdpmZHQd5_CpPOk7TtnFZrB-JRY,3349
391
- flwr/superlink/servicer/control/control_servicer.py,sha256=RFttpc1O0pYBaru1SXE6v3hUoNfgR3_ijN02bSVhDsM,13914
398
+ flwr/superlink/servicer/control/control_servicer.py,sha256=zY1ARksabr776eLQDy48wDmEx9t-VXTOnHq1h5Mt61U,16143
392
399
  flwr/superlink/servicer/control/control_user_auth_interceptor.py,sha256=9Aqhrt_UX80FXbIQVXUrqDHs5rD5CA7vEn0Bh-zPiYU,6232
393
400
  flwr/supernode/__init__.py,sha256=KgeCaVvXWrU3rptNR1y0oBp4YtXbAcrnCcJAiOoWkI4,707
394
401
  flwr/supernode/cli/__init__.py,sha256=JuEMr0-s9zv-PEWKuLB9tj1ocNfroSyNJ-oyv7ati9A,887
@@ -404,7 +411,7 @@ flwr/supernode/servicer/__init__.py,sha256=lucTzre5WPK7G1YLCfaqg3rbFWdNSb7ZTt-ca
404
411
  flwr/supernode/servicer/clientappio/__init__.py,sha256=7Oy62Y_oijqF7Dxi6tpcUQyOpLc_QpIRZ83NvwmB0Yg,813
405
412
  flwr/supernode/servicer/clientappio/clientappio_servicer.py,sha256=nIHRu38EWK-rpNOkcgBRAAKwYQQWFeCwu0lkO7OPZGQ,10239
406
413
  flwr/supernode/start_client_internal.py,sha256=Y9S1-QlO2WP6eo4JvWzIpfaCoh2aoE7bjEYyxNNnlyg,20777
407
- flwr_nightly-1.22.0.dev20250915.dist-info/METADATA,sha256=FBo-ub8Rc1rRhLrioWMroybBDcoP9t7v6vBqdE9U3do,15967
408
- flwr_nightly-1.22.0.dev20250915.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
409
- flwr_nightly-1.22.0.dev20250915.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
410
- flwr_nightly-1.22.0.dev20250915.dist-info/RECORD,,
414
+ flwr_nightly-1.22.0.dev20250917.dist-info/METADATA,sha256=NGqW090jvJZ7dg66AQQr9jKb4SF7DdF78xwqFuhtFUE,14559
415
+ flwr_nightly-1.22.0.dev20250917.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
416
+ flwr_nightly-1.22.0.dev20250917.dist-info/entry_points.txt,sha256=hxHD2ixb_vJFDOlZV-zB4Ao32_BQlL34ftsDh1GXv14,420
417
+ flwr_nightly-1.22.0.dev20250917.dist-info/RECORD,,