flwr-nightly 1.14.0.dev20241209__py3-none-any.whl → 1.14.0.dev20241211__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

@@ -32,6 +32,7 @@ from flwr.common.serde import (
32
32
  fab_from_proto,
33
33
  fab_to_proto,
34
34
  run_status_from_proto,
35
+ run_status_to_proto,
35
36
  run_to_proto,
36
37
  user_config_from_proto,
37
38
  )
@@ -48,6 +49,8 @@ from flwr.proto.run_pb2 import ( # pylint: disable=E0611
48
49
  CreateRunResponse,
49
50
  GetRunRequest,
50
51
  GetRunResponse,
52
+ GetRunStatusRequest,
53
+ GetRunStatusResponse,
51
54
  UpdateRunStatusRequest,
52
55
  UpdateRunStatusResponse,
53
56
  )
@@ -284,6 +287,21 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
284
287
  state.add_serverapp_log(request.run_id, merged_logs)
285
288
  return PushLogsResponse()
286
289
 
290
+ def GetRunStatus(
291
+ self, request: GetRunStatusRequest, context: grpc.ServicerContext
292
+ ) -> GetRunStatusResponse:
293
+ """Get the status of a run."""
294
+ log(DEBUG, "ServerAppIoServicer.GetRunStatus")
295
+ state = self.state_factory.state()
296
+
297
+ # Get run status from LinkState
298
+ run_statuses = state.get_run_status(set(request.run_ids))
299
+ run_status_dict = {
300
+ run_id: run_status_to_proto(run_status)
301
+ for run_id, run_status in run_statuses.items()
302
+ }
303
+ return GetRunStatusResponse(run_status_dict=run_status_dict)
304
+
287
305
 
288
306
  def _raise_if(validation_error: bool, detail: str) -> None:
289
307
  if validation_error:
@@ -14,18 +14,21 @@
14
14
  # ==============================================================================
15
15
  """SuperExec gRPC API."""
16
16
 
17
+ from collections.abc import Sequence
17
18
  from logging import INFO
18
19
  from typing import Optional
19
20
 
20
21
  import grpc
21
22
 
22
23
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
24
+ from flwr.common.auth_plugin import ExecAuthPlugin
23
25
  from flwr.common.logger import log
24
26
  from flwr.common.typing import UserConfig
25
27
  from flwr.proto.exec_pb2_grpc import add_ExecServicer_to_server
26
28
  from flwr.server.superlink.ffs.ffs_factory import FfsFactory
27
29
  from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
28
30
  from flwr.server.superlink.linkstate import LinkStateFactory
31
+ from flwr.superexec.exec_user_auth_interceptor import ExecUserAuthInterceptor
29
32
 
30
33
  from .exec_servicer import ExecServicer
31
34
  from .executor import Executor
@@ -39,6 +42,7 @@ def run_exec_api_grpc(
39
42
  ffs_factory: FfsFactory,
40
43
  certificates: Optional[tuple[bytes, bytes, bytes]],
41
44
  config: UserConfig,
45
+ auth_plugin: Optional[ExecAuthPlugin] = None,
42
46
  ) -> grpc.Server:
43
47
  """Run Exec API (gRPC, request-response)."""
44
48
  executor.set_config(config)
@@ -47,16 +51,29 @@ def run_exec_api_grpc(
47
51
  linkstate_factory=state_factory,
48
52
  ffs_factory=ffs_factory,
49
53
  executor=executor,
54
+ auth_plugin=auth_plugin,
50
55
  )
56
+ interceptors: Optional[Sequence[grpc.ServerInterceptor]] = None
57
+ if auth_plugin is not None:
58
+ interceptors = [ExecUserAuthInterceptor(auth_plugin)]
51
59
  exec_add_servicer_to_server_fn = add_ExecServicer_to_server
52
60
  exec_grpc_server = generic_create_grpc_server(
53
61
  servicer_and_add_fn=(exec_servicer, exec_add_servicer_to_server_fn),
54
62
  server_address=address,
55
63
  max_message_length=GRPC_MAX_MESSAGE_LENGTH,
56
64
  certificates=certificates,
65
+ interceptors=interceptors,
57
66
  )
58
67
 
59
- log(INFO, "Flower Deployment Engine: Starting Exec API on %s", address)
68
+ if auth_plugin is None:
69
+ log(INFO, "Flower Deployment Engine: Starting Exec API on %s", address)
70
+ else:
71
+ log(
72
+ INFO,
73
+ "Flower Deployment Engine: Starting Exec API with user "
74
+ "authentication on %s",
75
+ address,
76
+ )
60
77
  exec_grpc_server.start()
61
78
 
62
79
  return exec_grpc_server
@@ -18,11 +18,12 @@
18
18
  import time
19
19
  from collections.abc import Generator
20
20
  from logging import ERROR, INFO
21
- from typing import Any
21
+ from typing import Any, Optional
22
22
 
23
23
  import grpc
24
24
 
25
25
  from flwr.common import now
26
+ from flwr.common.auth_plugin import ExecAuthPlugin
26
27
  from flwr.common.constant import LOG_STREAM_INTERVAL, Status, SubStatus
27
28
  from flwr.common.logger import log
28
29
  from flwr.common.serde import (
@@ -60,11 +61,13 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
60
61
  linkstate_factory: LinkStateFactory,
61
62
  ffs_factory: FfsFactory,
62
63
  executor: Executor,
64
+ auth_plugin: Optional[ExecAuthPlugin] = None,
63
65
  ) -> None:
64
66
  self.linkstate_factory = linkstate_factory
65
67
  self.ffs_factory = ffs_factory
66
68
  self.executor = executor
67
69
  self.executor.initialize(linkstate_factory, ffs_factory)
70
+ self.auth_plugin = auth_plugin
68
71
 
69
72
  def StartRun(
70
73
  self, request: StartRunRequest, context: grpc.ServicerContext
@@ -164,14 +167,30 @@ class ExecServicer(exec_pb2_grpc.ExecServicer):
164
167
  ) -> GetLoginDetailsResponse:
165
168
  """Start login."""
166
169
  log(INFO, "ExecServicer.GetLoginDetails")
167
- return GetLoginDetailsResponse(login_details={})
170
+ if self.auth_plugin is None:
171
+ context.abort(
172
+ grpc.StatusCode.UNIMPLEMENTED,
173
+ "ExecServicer initialized without user authentication",
174
+ )
175
+ raise grpc.RpcError() # This line is unreachable
176
+ return GetLoginDetailsResponse(
177
+ login_details=self.auth_plugin.get_login_details()
178
+ )
168
179
 
169
180
  def GetAuthTokens(
170
181
  self, request: GetAuthTokensRequest, context: grpc.ServicerContext
171
182
  ) -> GetAuthTokensResponse:
172
183
  """Get auth token."""
173
184
  log(INFO, "ExecServicer.GetAuthTokens")
174
- return GetAuthTokensResponse(auth_tokens={})
185
+ if self.auth_plugin is None:
186
+ context.abort(
187
+ grpc.StatusCode.UNIMPLEMENTED,
188
+ "ExecServicer initialized without user authentication",
189
+ )
190
+ raise grpc.RpcError() # This line is unreachable
191
+ return GetAuthTokensResponse(
192
+ auth_tokens=self.auth_plugin.get_auth_tokens(dict(request.auth_details))
193
+ )
175
194
 
176
195
 
177
196
  def _create_list_runs_response(run_ids: set[int], state: LinkState) -> ListRunsResponse:
@@ -0,0 +1,101 @@
1
+ # Copyright 2024 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 Exec API interceptor."""
16
+
17
+
18
+ from typing import Any, Callable, Union
19
+
20
+ import grpc
21
+
22
+ from flwr.common.auth_plugin import ExecAuthPlugin
23
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
24
+ GetAuthTokensRequest,
25
+ GetAuthTokensResponse,
26
+ GetLoginDetailsRequest,
27
+ GetLoginDetailsResponse,
28
+ StartRunRequest,
29
+ StartRunResponse,
30
+ StreamLogsRequest,
31
+ StreamLogsResponse,
32
+ )
33
+
34
+ Request = Union[
35
+ StartRunRequest,
36
+ StreamLogsRequest,
37
+ GetLoginDetailsRequest,
38
+ GetAuthTokensRequest,
39
+ ]
40
+
41
+ Response = Union[
42
+ StartRunResponse, StreamLogsResponse, GetLoginDetailsResponse, GetAuthTokensResponse
43
+ ]
44
+
45
+
46
+ class ExecUserAuthInterceptor(grpc.ServerInterceptor): # type: ignore
47
+ """Exec API interceptor for user authentication."""
48
+
49
+ def __init__(
50
+ self,
51
+ auth_plugin: ExecAuthPlugin,
52
+ ):
53
+ self.auth_plugin = auth_plugin
54
+
55
+ def intercept_service(
56
+ self,
57
+ continuation: Callable[[Any], Any],
58
+ handler_call_details: grpc.HandlerCallDetails,
59
+ ) -> grpc.RpcMethodHandler:
60
+ """Flower server interceptor authentication logic.
61
+
62
+ Intercept all unary-unary/unary-stream calls from users and authenticate users
63
+ by validating auth metadata sent by the user. Continue RPC call if user is
64
+ authenticated, else, terminate RPC call by setting context to abort.
65
+ """
66
+ # One of the method handlers in
67
+ # `flwr.superexec.exec_servicer.ExecServicer`
68
+ method_handler: grpc.RpcMethodHandler = continuation(handler_call_details)
69
+ return self._generic_auth_unary_method_handler(method_handler)
70
+
71
+ def _generic_auth_unary_method_handler(
72
+ self, method_handler: grpc.RpcMethodHandler
73
+ ) -> grpc.RpcMethodHandler:
74
+ def _generic_method_handler(
75
+ request: Request,
76
+ context: grpc.ServicerContext,
77
+ ) -> Response:
78
+ call = method_handler.unary_unary or method_handler.unary_stream
79
+ metadata = context.invocation_metadata()
80
+ if isinstance(
81
+ request, (GetLoginDetailsRequest, GetAuthTokensRequest)
82
+ ) or self.auth_plugin.validate_tokens_in_metadata(metadata):
83
+ return call(request, context) # type: ignore
84
+
85
+ tokens = self.auth_plugin.refresh_tokens(context.invocation_metadata())
86
+ if tokens is not None:
87
+ context.send_initial_metadata(tokens)
88
+ return call(request, context) # type: ignore
89
+
90
+ context.abort(grpc.StatusCode.UNAUTHENTICATED, "Access denied")
91
+ raise grpc.RpcError() # This line is unreachable
92
+
93
+ if method_handler.unary_unary:
94
+ message_handler = grpc.unary_unary_rpc_method_handler
95
+ else:
96
+ message_handler = grpc.unary_stream_rpc_method_handler
97
+ return message_handler(
98
+ _generic_method_handler,
99
+ request_deserializer=method_handler.request_deserializer,
100
+ response_serializer=method_handler.response_serializer,
101
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.14.0.dev20241209
3
+ Version: 1.14.0.dev20241211
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -39,8 +39,9 @@ Requires-Dist: numpy (>=1.26.0,<3.0.0)
39
39
  Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
40
  Requires-Dist: protobuf (>=4.25.2,<5.0.0)
41
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
+ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
42
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
43
- Requires-Dist: requests (>=2.31.0,<3.0.0) ; extra == "rest"
44
+ Requires-Dist: requests (>=2.31.0,<3.0.0)
44
45
  Requires-Dist: rich (>=13.5.0,<14.0.0)
45
46
  Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
@@ -101,23 +102,23 @@ Flower's goal is to make federated learning accessible to everyone. This series
101
102
 
102
103
  0. **What is Federated Learning?**
103
104
 
104
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-what-is-federated-learning.ipynb))
105
+ [![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))
105
106
 
106
107
  1. **An Introduction to Federated Learning**
107
108
 
108
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-get-started-with-flower-pytorch.ipynb))
109
+ [![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))
109
110
 
110
111
  2. **Using Strategies in Federated Learning**
111
112
 
112
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-use-a-federated-learning-strategy-pytorch.ipynb))
113
+ [![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))
113
114
 
114
115
  3. **Building Strategies for Federated Learning**
115
116
 
116
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-build-a-strategy-from-scratch-pytorch.ipynb))
117
+ [![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))
117
118
 
118
119
  4. **Custom Clients for Federated Learning**
119
120
 
120
- [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb) (or open the [Jupyter Notebook](https://github.com/adap/flower/blob/main/doc/source/tutorial-series-customize-the-client-pytorch.ipynb))
121
+ [![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/adap/flower/blob/main/doc/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))
121
122
 
122
123
  Stay tuned, more tutorials are coming soon. Topics include **Privacy and Security in Federated Learning**, and **Scaling Federated Learning**.
123
124
 
@@ -1,12 +1,15 @@
1
1
  flwr/__init__.py,sha256=VmBWedrCxqmt4QvUHBLqyVEH6p7zaFMD_oCHerXHSVw,937
2
2
  flwr/cli/__init__.py,sha256=cZJVgozlkC6Ni2Hd_FAIrqefrkCGOV18fikToq-6iLw,720
3
- flwr/cli/app.py,sha256=4naV5q1Fepne8XAgdGISxotWSIT__sm0TIHdodSvou4,1335
3
+ flwr/cli/app.py,sha256=KF__zHSy7KQCMx_Rb0YPzcoZbQY-Zo4f70BhBgP4ENM,1381
4
4
  flwr/cli/build.py,sha256=k2M0aIY2q5WB_yXQ22Woxt1zb6m-Z1wNwmhWMxEm5Dw,6344
5
- flwr/cli/config_utils.py,sha256=n-xNkQG_0POz5UUHyE00lthNaOjuS6IYU9Thzb_BThs,11431
5
+ flwr/cli/cli_user_auth_interceptor.py,sha256=rEjgAZmzHO0GjwdyZib6bkTI2X59ErJAZlutqpqZGF0,2952
6
+ flwr/cli/config_utils.py,sha256=f4ViGujhEat9l3YDq24AE-hao4pAK_hVLRXZXDd_F_A,12078
6
7
  flwr/cli/example.py,sha256=1bGDYll3BXQY2kRqSN-oICqS5n1b9m0g0RvXTopXHl4,2215
7
8
  flwr/cli/install.py,sha256=kmD2dW-9B7645GAQx5es1o2W11gRHQ2Fg2E31SLomrg,8179
8
- flwr/cli/log.py,sha256=WlAuxZdTUYZ5bRKkm0jLWrOxHTS0TlSA5BeDtO9xF3k,6659
9
- flwr/cli/ls.py,sha256=aUaP49kkg4nV2nRYfO8qgbtV_FF5xN5gCy3ziD2HbUk,11513
9
+ flwr/cli/log.py,sha256=7V5NPGiR8FMDkkNTc5SE1pxMskQgp0H5HniG977LISo,5994
10
+ flwr/cli/login/__init__.py,sha256=PEh6QjLSx7ltN8d8Jfi25dHFPKtCNKjYJZCkYQBfmm0,799
11
+ flwr/cli/login/login.py,sha256=GVm6rkLDVQ6WuT2mw52gBKNW_Y5IjGg_OOGoEmpx9KM,2796
12
+ flwr/cli/ls.py,sha256=5uO0YG0XXn7paS4oUs1T7rwicApxMV3ac9ejBZfLN3k,10545
10
13
  flwr/cli/new/__init__.py,sha256=cQzK1WH4JP2awef1t2UQ2xjl1agVEz9rwutV18SWV1k,789
11
14
  flwr/cli/new/new.py,sha256=xgzObnhNpnGvjVs6wTj6BlJ9X-avPhRX3DuwWnk9ED0,9903
12
15
  flwr/cli/new/templates/__init__.py,sha256=4luU8RL-CK8JJCstQ_ON809W9bNTkY1l9zSaPKBkgwY,725
@@ -62,9 +65,9 @@ flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=UtH3Vslg2S8fIKIHC-d
62
65
  flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=01HArBqRrbZT3O7pXOM9MqduXMNm525wv7Sj6dvYMJE,686
63
66
  flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=KVCIOEYNWnq6j7XOboXqZshc9aQ2PyRDUu7bZtmfJ24,710
64
67
  flwr/cli/run/__init__.py,sha256=oCd6HmQDx-sqver1gecgx-uMA38BLTSiiKpl7RGNceg,789
65
- flwr/cli/run/run.py,sha256=5To92BOrfM5VEwNp2zzRUoz4tHE2NtazxIQICProA8k,8503
66
- flwr/cli/stop.py,sha256=OrV_znXyu3t_gABHisAA6uHwFdFPP2Z9bKvhcE1O5Yk,4116
67
- flwr/cli/utils.py,sha256=emMUdthvoHBTB0iGQp-oFBmA5wV46lw3y3FmfXQPCsc,4500
68
+ flwr/cli/run/run.py,sha256=sklMcREZnnuot4TSeCIpVYqZJ2Ar2SOye3q0lw5s218,8139
69
+ flwr/cli/stop.py,sha256=pa3etMLCLxfGl9w2c2o6e5u46j6LimEmNp2zuQGxAIk,3143
70
+ flwr/cli/utils.py,sha256=hiT4-tDPmS5U_mH0ED9DVTElfmfYUMV6JuPWZjTaIgQ,8330
68
71
  flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
69
72
  flwr/client/app.py,sha256=3AKrJduvki_1ATvKCQV4T9_1qZuarVVTtpnsq6_cWw0,34384
70
73
  flwr/client/client.py,sha256=gy6WVlMUFAp8oevN4xpQPX30vPOIYGVqdbuFlTWkyG4,9080
@@ -108,8 +111,10 @@ flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
108
111
  flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
109
112
  flwr/common/address.py,sha256=7kM2Rqjw86-c8aKwAvrXerWqznnVv4TFJ62aSAeTn10,3017
110
113
  flwr/common/args.py,sha256=-KeQ6AZw1-G4Ifhsg4qlRnWhGH1m_OzUgxH7Z4j_0ns,6222
111
- flwr/common/config.py,sha256=qC1QvGAGr4faBtg3Y5dWhfyK5FggyWUMjPqg-Rx_FW4,8083
112
- flwr/common/constant.py,sha256=G1arzDznYIlhUpkrk31-k-pJsRcOuoAoscI6bGe59nE,5792
114
+ flwr/common/auth_plugin/__init__.py,sha256=1Y8Oj3iB49IHDu9tvDih1J74Ygu7k85V9s2A4WORPyA,887
115
+ flwr/common/auth_plugin/auth_plugin.py,sha256=6WEAVVPrS7LgSBpd4WyHYU4EsajT2nBGI_IN3mhYzoU,3567
116
+ flwr/common/config.py,sha256=kH8u7VBRfyv5cpOC0lQ1jBbxJ6Jo2b3XhUwbIbHoHHw,8098
117
+ flwr/common/constant.py,sha256=9HwFVxFWbLTzMetIffUT3gAC9nPtqzBNxrKWr5A0oSI,5996
113
118
  flwr/common/context.py,sha256=uJ-mnoC_8y_udEb3kAX-r8CPphNTWM72z1AlsvQEu54,2403
114
119
  flwr/common/date.py,sha256=NHHpESce5wYqEwoDXf09gp9U9l_5Bmlh2BsOcwS-kDM,1554
115
120
  flwr/common/differential_privacy.py,sha256=XwcJ3rWr8S8BZUocc76vLSJAXIf6OHnWkBV6-xlIRuw,6106
@@ -138,9 +143,9 @@ flwr/common/secure_aggregation/crypto/symmetric_encryption.py,sha256=wTDbOaMGZwT
138
143
  flwr/common/secure_aggregation/ndarrays_arithmetic.py,sha256=zvVAIrIyI6OSzGhpCi8NNaTvPXmoMYQIPJT-NkBg8RU,3013
139
144
  flwr/common/secure_aggregation/quantization.py,sha256=mC4uLf05zeONo8Ke-BY0Tj8UCMOS7VD93zHCzuv3MHU,2304
140
145
  flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
141
- flwr/common/secure_aggregation/secaggplus_utils.py,sha256=o7IhHH6J9xqinhQy3TdPgQpoj1XyEpyv3OQFyx81RVQ,3193
146
+ flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
142
147
  flwr/common/serde.py,sha256=K9ExsqcTPETESkt2HMaNtIQAIAfwmuwtJFlG-59I7Sw,31046
143
- flwr/common/telemetry.py,sha256=20AYNaePOBaSEh99PIuBrxRxtY53-kZ5-2Ej0JWUJmc,8731
148
+ flwr/common/telemetry.py,sha256=CHIwFFQ13sWFavmEvkvA43XR1sbh1S3nWvD5TuCO2eI,8774
144
149
  flwr/common/typing.py,sha256=RLq2f9jhE_Nndtk023cPMG0LpoQHaacEsww-3j0xs4Q,5710
145
150
  flwr/common/version.py,sha256=tCcl_FvxVK206C1dxIJCs4TjL06WmyaODBP19FRHE1c,1324
146
151
  flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
@@ -188,10 +193,10 @@ flwr/proto/run_pb2.py,sha256=J2TQwf-S0o9ImGuQLrczw99S0GSXm6hk-npJ8rXAC0Y,5743
188
193
  flwr/proto/run_pb2.pyi,sha256=i6TEwphuFH94_kT2hZWb_RjndLuphkPrT3C2VP-NnVs,11739
189
194
  flwr/proto/run_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
190
195
  flwr/proto/run_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
191
- flwr/proto/serverappio_pb2.py,sha256=zWnODeaj26oSx98-BFvwtWM_fYvsw9OeSIuV7JnKVvw,4822
192
- flwr/proto/serverappio_pb2.pyi,sha256=Ib9c32FCtjA9zZY54Ohi6B-DtLgSjokAqOExm_2uOvY,6429
193
- flwr/proto/serverappio_pb2_grpc.py,sha256=M__pFMmb9yTAGMHVd3_K1V6DeLRuFc9UErJHWjBAsZs,17439
194
- flwr/proto/serverappio_pb2_grpc.pyi,sha256=ERM-0cQVmUqrVXlvEbS2wfUZpZmv5SlIeNsGZPYMrVo,4779
196
+ flwr/proto/serverappio_pb2.py,sha256=VXJxFLDrH4XzCEM9VnNg3z7gVIsrvl1VE4ZtK_lI_eE,5003
197
+ flwr/proto/serverappio_pb2.pyi,sha256=5SoXVb7fyN0xkl411pmJChlWeQ-sr1Qf9J3B0cAQYc4,6665
198
+ flwr/proto/serverappio_pb2_grpc.py,sha256=fGmk0XC7il5wYFSo6zEa21Ki1OYvEuDDXL0hDDoU4QQ,19062
199
+ flwr/proto/serverappio_pb2_grpc.pyi,sha256=pKdqFpAgkHaNSjRNahnGtSndUif8uB5eFui_q37eDho,5220
195
200
  flwr/proto/simulationio_pb2.py,sha256=Fv7m8d4vR_0CIGU93nN5tDXSCk2QPbASH_8mT2wBPTE,3117
196
201
  flwr/proto/simulationio_pb2.pyi,sha256=oXx8_FLBe5B54wduZj-f89kub73XxNtQbThuW8YfPAs,2660
197
202
  flwr/proto/simulationio_pb2_grpc.py,sha256=9I3yAfJaeMuG-qH_5Ge45eFOftsIOmL9b8E_xHmcvKw,11232
@@ -206,7 +211,7 @@ flwr/proto/transport_pb2_grpc.py,sha256=vLN3EHtx2aEEMCO4f1Upu-l27BPzd3-5pV-u8wPc
206
211
  flwr/proto/transport_pb2_grpc.pyi,sha256=AGXf8RiIiW2J5IKMlm_3qT3AzcDa4F3P5IqUjve_esA,766
207
212
  flwr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
213
  flwr/server/__init__.py,sha256=cEg1oecBu4cKB69iJCqWEylC8b5XW47bl7rQiJsdTvM,1528
209
- flwr/server/app.py,sha256=wes1HI5KJfzPry7bjztQDazn1FIca3CS6kEVM_6LLUY,28872
214
+ flwr/server/app.py,sha256=c9XHwSYuTL3xU9BKEbKeEJ0frWveectLjSr_EA4lnT8,30868
210
215
  flwr/server/client_manager.py,sha256=7Ese0tgrH-i-ms363feYZJKwB8gWnXSmg_hYF2Bju4U,6227
211
216
  flwr/server/client_proxy.py,sha256=4G-oTwhb45sfWLx2uZdcXD98IZwdTS6F88xe3akCdUg,2399
212
217
  flwr/server/compat/__init__.py,sha256=VxnJtJyOjNFQXMNi9hIuzNlZM5n0Hj1p3aq_Pm2udw4,892
@@ -217,7 +222,7 @@ flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_Od
217
222
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
218
223
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
219
224
  flwr/server/driver/driver.py,sha256=u_fMfqLYTroTafGCNwKPHI4lttRL-Z5CqeT3_FHSq-Q,5701
220
- flwr/server/driver/grpc_driver.py,sha256=aTeQVYjyp19LGUa-a5iKdQRFijLzut2bXj1h8YovdIM,11397
225
+ flwr/server/driver/grpc_driver.py,sha256=cMYtyQJRSwfhCmtJ5UEWN4iXrUKRH5iGXmigiU6sGjM,11529
221
226
  flwr/server/driver/inmemory_driver.py,sha256=gfB4jmkk1indhRa9XCdKCXghVcWBF1qBD-tAxMUyQm0,6404
222
227
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
223
228
  flwr/server/run_serverapp.py,sha256=oDfHaHyVT5BRcckFFQKg8AVPCWR1ek7OhNceTC8qq9g,2493
@@ -254,7 +259,7 @@ flwr/server/strategy/strategy.py,sha256=cXapkD5uDrt5C-RbmWDn9FLoap3Q41i7GKvbmfbC
254
259
  flwr/server/superlink/__init__.py,sha256=8tHYCfodUlRD8PCP9fHgvu8cz5N31A2QoRVL0jDJ15E,707
255
260
  flwr/server/superlink/driver/__init__.py,sha256=5soEK5QSvxNjmJQ-CGTWROc4alSAeU0e9Ad9RDhsd3E,717
256
261
  flwr/server/superlink/driver/serverappio_grpc.py,sha256=oTogZLkfeThKdx9Q_bw6OMGHnLIryxQOHxbWi0qgaRM,2185
257
- flwr/server/superlink/driver/serverappio_servicer.py,sha256=nUQgQlxUfCYIvUW5NBq0ZysEL2cFoF2iQJIFabGodNE,10458
262
+ flwr/server/superlink/driver/serverappio_servicer.py,sha256=MSJPcSDim36sXPoK21XmhHYZwWI-i9Z5NiZrvyBRJyc,11124
258
263
  flwr/server/superlink/ffs/__init__.py,sha256=FAY-zShcfPmOxosok2QyT6hTNMNctG8cH9s_nIl8jkI,840
259
264
  flwr/server/superlink/ffs/disk_ffs.py,sha256=yCN6CCzegnJIOaHr5nIu49wZQa4g5BByiSKshz50RKU,3296
260
265
  flwr/server/superlink/ffs/ffs.py,sha256=qLI1UfosJugu2BKOJWqHIhafTm-YiuKqGf3OGWPH0NM,2395
@@ -310,12 +315,13 @@ flwr/simulation/simulationio_connection.py,sha256=m31L9Iej-61va48E5x-wJypA6p5s82
310
315
  flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
311
316
  flwr/superexec/app.py,sha256=Tt3GonnTwHrMmicwx9XaP-crP78-bf4DUWl-N5cG6zY,1841
312
317
  flwr/superexec/deployment.py,sha256=7VYmmI12zEaTHp_cQtU1GLikmqhctUHhEdshBPRFHMs,6734
313
- flwr/superexec/exec_grpc.py,sha256=OuhBAk7hiky9rjGceinLGIXqchtzGPQThZnwyYv6Ei0,2241
314
- flwr/superexec/exec_servicer.py,sha256=S8Wr4bL8gNN5OV-Vl-m73PSYzHHyFe94FJKlSlXewPs,6659
318
+ flwr/superexec/exec_grpc.py,sha256=hG1bxAbwB7Wt7R73931ib_UIcWvY628IIqk5rk3b25o,2896
319
+ flwr/superexec/exec_servicer.py,sha256=jEYcASzkQR1ftjzilmlcTPKXo8NSno9mSj_UbBvMjGM,7467
320
+ flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
315
321
  flwr/superexec/executor.py,sha256=zH3_53il6Jh0ZscIVEB9f4GNnXMeBbCGyCoBCxLgiG0,3114
316
322
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
317
- flwr_nightly-1.14.0.dev20241209.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
318
- flwr_nightly-1.14.0.dev20241209.dist-info/METADATA,sha256=OqqIhyoOusHI0s2giCqSRVbMW_59v190s1EEewwfdas,15679
319
- flwr_nightly-1.14.0.dev20241209.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
320
- flwr_nightly-1.14.0.dev20241209.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
321
- flwr_nightly-1.14.0.dev20241209.dist-info/RECORD,,
323
+ flwr_nightly-1.14.0.dev20241211.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
324
+ flwr_nightly-1.14.0.dev20241211.dist-info/METADATA,sha256=onYC4ZwXpA_wegLQm_jOd4kFEDQtuJAHOsZ3wYWmue0,15799
325
+ flwr_nightly-1.14.0.dev20241211.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
326
+ flwr_nightly-1.14.0.dev20241211.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
327
+ flwr_nightly-1.14.0.dev20241211.dist-info/RECORD,,