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.
- flwr/cli/app.py +2 -0
- flwr/cli/cli_user_auth_interceptor.py +86 -0
- flwr/cli/config_utils.py +18 -2
- flwr/cli/log.py +10 -31
- flwr/cli/login/__init__.py +21 -0
- flwr/cli/login/login.py +82 -0
- flwr/cli/ls.py +10 -40
- flwr/cli/run/run.py +14 -25
- flwr/cli/stop.py +9 -39
- flwr/cli/utils.py +108 -1
- flwr/common/auth_plugin/__init__.py +24 -0
- flwr/common/auth_plugin/auth_plugin.py +111 -0
- flwr/common/config.py +2 -1
- flwr/common/constant.py +6 -1
- flwr/common/secure_aggregation/secaggplus_utils.py +2 -2
- flwr/common/telemetry.py +2 -1
- flwr/proto/serverappio_pb2.py +18 -18
- flwr/proto/serverappio_pb2.pyi +8 -2
- flwr/proto/serverappio_pb2_grpc.py +34 -0
- flwr/proto/serverappio_pb2_grpc.pyi +13 -0
- flwr/server/app.py +52 -1
- flwr/server/driver/grpc_driver.py +6 -2
- flwr/server/superlink/driver/serverappio_servicer.py +18 -0
- flwr/superexec/exec_grpc.py +18 -1
- flwr/superexec/exec_servicer.py +22 -3
- flwr/superexec/exec_user_auth_interceptor.py +101 -0
- {flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/METADATA +8 -7
- {flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/RECORD +31 -25
- {flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/entry_points.txt +0 -0
|
@@ -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:
|
flwr/superexec/exec_grpc.py
CHANGED
|
@@ -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
|
-
|
|
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
|
flwr/superexec/exec_servicer.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
+
)
|
{flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flwr-nightly
|
|
3
|
-
Version: 1.14.0.
|
|
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)
|
|
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
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
|
105
|
+
[](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
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
|
109
|
+
[](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
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
|
113
|
+
[](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
|
-
[](https://colab.research.google.com/github/adap/flower/blob/main/
|
|
117
|
+
[](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
|
-
[](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/
|
|
121
|
+
[](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
|
|
{flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/RECORD
RENAMED
|
@@ -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=
|
|
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/
|
|
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=
|
|
9
|
-
flwr/cli/
|
|
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=
|
|
66
|
-
flwr/cli/stop.py,sha256=
|
|
67
|
-
flwr/cli/utils.py,sha256=
|
|
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/
|
|
112
|
-
flwr/common/
|
|
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=
|
|
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=
|
|
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=
|
|
192
|
-
flwr/proto/serverappio_pb2.pyi,sha256=
|
|
193
|
-
flwr/proto/serverappio_pb2_grpc.py,sha256=
|
|
194
|
-
flwr/proto/serverappio_pb2_grpc.pyi,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
314
|
-
flwr/superexec/exec_servicer.py,sha256=
|
|
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.
|
|
318
|
-
flwr_nightly-1.14.0.
|
|
319
|
-
flwr_nightly-1.14.0.
|
|
320
|
-
flwr_nightly-1.14.0.
|
|
321
|
-
flwr_nightly-1.14.0.
|
|
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,,
|
{flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/LICENSE
RENAMED
|
File without changes
|
{flwr_nightly-1.14.0.dev20241209.dist-info → flwr_nightly-1.14.0.dev20241211.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|