flwr-nightly 1.16.0.dev20250310__py3-none-any.whl → 1.17.0.dev20250312__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.
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
- flwr/client/client_app.py +0 -9
- flwr/client/clientapp/app.py +4 -0
- flwr/client/supernode/__init__.py +0 -2
- flwr/client/supernode/app.py +1 -11
- flwr/common/telemetry.py +0 -10
- flwr/server/run_serverapp.py +2 -13
- flwr/superexec/app.py +0 -14
- flwr/superexec/exec_event_log_interceptor.py +135 -0
- flwr/superexec/exec_user_auth_interceptor.py +18 -2
- {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/METADATA +1 -1
- {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/RECORD +24 -23
- {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/entry_points.txt +0 -3
- {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/WHEEL +0 -0
@@ -35,7 +35,7 @@ warnings.filterwarnings("ignore", category=UserWarning)
|
|
35
35
|
# pylint: disable=too-many-arguments
|
36
36
|
# pylint: disable=too-many-instance-attributes
|
37
37
|
class FlowerClient(NumPyClient):
|
38
|
-
"""
|
38
|
+
"""Flower client for LLM fine-tuning."""
|
39
39
|
|
40
40
|
def __init__(
|
41
41
|
self,
|
flwr/client/client_app.py
CHANGED
@@ -102,15 +102,6 @@ class ClientApp:
|
|
102
102
|
>>> return FlowerClient().to_client()
|
103
103
|
>>>
|
104
104
|
>>> app = ClientApp(client_fn)
|
105
|
-
|
106
|
-
If the above code is in a Python module called `client`, it can be started as
|
107
|
-
follows:
|
108
|
-
|
109
|
-
>>> flower-client-app client:app --insecure
|
110
|
-
|
111
|
-
In this `client:app` example, `client` refers to the Python module `client.py` in
|
112
|
-
which the previous code lives in and `app` refers to the global attribute `app` that
|
113
|
-
points to an object of type `ClientApp`.
|
114
105
|
"""
|
115
106
|
|
116
107
|
def __init__(
|
flwr/client/clientapp/app.py
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import argparse
|
19
|
+
import gc
|
19
20
|
import time
|
20
21
|
from logging import DEBUG, ERROR, INFO
|
21
22
|
from typing import Optional
|
@@ -160,6 +161,9 @@ def run_clientapp( # pylint: disable=R0914
|
|
160
161
|
stub=stub, token=token, message=reply_message, context=context
|
161
162
|
)
|
162
163
|
|
164
|
+
del client_app, message, context, run, fab, reply_message
|
165
|
+
gc.collect()
|
166
|
+
|
163
167
|
# Reset token to `None` to prevent flwr-clientapp from trying to pull the
|
164
168
|
# same inputs again
|
165
169
|
token = None
|
flwr/client/supernode/app.py
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import argparse
|
19
|
-
from logging import DEBUG,
|
19
|
+
from logging import DEBUG, INFO, WARN
|
20
20
|
from pathlib import Path
|
21
21
|
from typing import Optional
|
22
22
|
|
@@ -98,16 +98,6 @@ def run_supernode() -> None:
|
|
98
98
|
)
|
99
99
|
|
100
100
|
|
101
|
-
def run_client_app() -> None:
|
102
|
-
"""Run Flower client app."""
|
103
|
-
event(EventType.RUN_CLIENT_APP_ENTER)
|
104
|
-
log(
|
105
|
-
ERROR,
|
106
|
-
"The command `flower-client-app` has been replaced by `flwr run`.",
|
107
|
-
)
|
108
|
-
register_exit_handlers(event_type=EventType.RUN_CLIENT_APP_LEAVE)
|
109
|
-
|
110
|
-
|
111
101
|
def _parse_args_run_supernode() -> argparse.ArgumentParser:
|
112
102
|
"""Parse flower-supernode command line arguments."""
|
113
103
|
parser = argparse.ArgumentParser(
|
flwr/common/telemetry.py
CHANGED
@@ -181,16 +181,6 @@ class EventType(str, Enum):
|
|
181
181
|
RUN_SUPERNODE_ENTER = auto()
|
182
182
|
RUN_SUPERNODE_LEAVE = auto()
|
183
183
|
|
184
|
-
# --- DEPRECATED -------------------------------------------------------------------
|
185
|
-
|
186
|
-
# [DEPRECATED] CLI: `flower-server-app`
|
187
|
-
RUN_SERVER_APP_ENTER = auto()
|
188
|
-
RUN_SERVER_APP_LEAVE = auto()
|
189
|
-
|
190
|
-
# [DEPRECATED] CLI: `flower-client-app`
|
191
|
-
RUN_CLIENT_APP_ENTER = auto()
|
192
|
-
RUN_CLIENT_APP_LEAVE = auto()
|
193
|
-
|
194
184
|
|
195
185
|
# Use the ThreadPoolExecutor with max_workers=1 to have a queue
|
196
186
|
# and also ensure that telemetry calls are not blocking.
|
flwr/server/run_serverapp.py
CHANGED
@@ -15,11 +15,10 @@
|
|
15
15
|
"""Run ServerApp."""
|
16
16
|
|
17
17
|
|
18
|
-
from logging import DEBUG
|
18
|
+
from logging import DEBUG
|
19
19
|
from typing import Optional
|
20
20
|
|
21
|
-
from flwr.common import Context
|
22
|
-
from flwr.common.exit_handlers import register_exit_handlers
|
21
|
+
from flwr.common import Context
|
23
22
|
from flwr.common.logger import log
|
24
23
|
from flwr.common.object_ref import load_app
|
25
24
|
|
@@ -64,13 +63,3 @@ def run(
|
|
64
63
|
|
65
64
|
log(DEBUG, "ServerApp finished running.")
|
66
65
|
return context
|
67
|
-
|
68
|
-
|
69
|
-
def run_server_app() -> None:
|
70
|
-
"""Run Flower server app."""
|
71
|
-
event(EventType.RUN_SERVER_APP_ENTER)
|
72
|
-
log(
|
73
|
-
ERROR,
|
74
|
-
"The command `flower-server-app` has been replaced by `flwr run`.",
|
75
|
-
)
|
76
|
-
register_exit_handlers(event_type=EventType.RUN_SERVER_APP_LEAVE)
|
flwr/superexec/app.py
CHANGED
@@ -16,26 +16,12 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import argparse
|
19
|
-
import sys
|
20
|
-
from logging import INFO
|
21
19
|
|
22
|
-
from flwr.common import log
|
23
20
|
from flwr.common.object_ref import load_app, validate
|
24
21
|
|
25
22
|
from .executor import Executor
|
26
23
|
|
27
24
|
|
28
|
-
def run_superexec() -> None:
|
29
|
-
"""Run Flower SuperExec."""
|
30
|
-
log(INFO, "Starting Flower SuperExec")
|
31
|
-
|
32
|
-
sys.exit(
|
33
|
-
"Manually launching the SuperExec is deprecated. Since `flwr 1.13.0` "
|
34
|
-
"the executor service runs in the SuperLink. Launching it manually is not "
|
35
|
-
"recommended."
|
36
|
-
)
|
37
|
-
|
38
|
-
|
39
25
|
def load_executor(
|
40
26
|
args: argparse.Namespace,
|
41
27
|
) -> Executor:
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
# ==============================================================================
|
15
|
+
"""Flower Exec API event log interceptor."""
|
16
|
+
|
17
|
+
|
18
|
+
from collections.abc import Iterator
|
19
|
+
from typing import Any, Callable, Union, cast
|
20
|
+
|
21
|
+
import grpc
|
22
|
+
from google.protobuf.message import Message as GrpcMessage
|
23
|
+
|
24
|
+
from flwr.common.event_log_plugin.event_log_plugin import EventLogWriterPlugin
|
25
|
+
from flwr.common.typing import LogEntry
|
26
|
+
|
27
|
+
from .exec_user_auth_interceptor import shared_user_info
|
28
|
+
|
29
|
+
|
30
|
+
class ExecEventLogInterceptor(grpc.ServerInterceptor): # type: ignore
|
31
|
+
"""Exec API interceptor for logging events."""
|
32
|
+
|
33
|
+
def __init__(self, log_plugin: EventLogWriterPlugin) -> None:
|
34
|
+
self.log_plugin = log_plugin
|
35
|
+
|
36
|
+
def intercept_service(
|
37
|
+
self,
|
38
|
+
continuation: Callable[[Any], Any],
|
39
|
+
handler_call_details: grpc.HandlerCallDetails,
|
40
|
+
) -> grpc.RpcMethodHandler:
|
41
|
+
"""Flower server interceptor logging logic.
|
42
|
+
|
43
|
+
Intercept all unary-unary/unary-stream calls from users and log the event.
|
44
|
+
Continue RPC call if event logger is enabled on the SuperLink, else, terminate
|
45
|
+
RPC call by setting context to abort.
|
46
|
+
"""
|
47
|
+
# One of the method handlers in
|
48
|
+
# `flwr.superexec.exec_servicer.ExecServicer`
|
49
|
+
method_handler: grpc.RpcMethodHandler = continuation(handler_call_details)
|
50
|
+
method_name: str = handler_call_details.method
|
51
|
+
return self._generic_event_log_unary_method_handler(method_handler, method_name)
|
52
|
+
|
53
|
+
def _generic_event_log_unary_method_handler(
|
54
|
+
self, method_handler: grpc.RpcMethodHandler, method_name: str
|
55
|
+
) -> grpc.RpcMethodHandler:
|
56
|
+
def _generic_method_handler(
|
57
|
+
request: GrpcMessage,
|
58
|
+
context: grpc.ServicerContext,
|
59
|
+
) -> Union[GrpcMessage, Iterator[GrpcMessage], Exception]:
|
60
|
+
log_entry: LogEntry
|
61
|
+
# Log before call
|
62
|
+
log_entry = self.log_plugin.compose_log_before_event(
|
63
|
+
request=request,
|
64
|
+
context=context,
|
65
|
+
user_info=shared_user_info.get(),
|
66
|
+
method_name=method_name,
|
67
|
+
)
|
68
|
+
self.log_plugin.write_log(log_entry)
|
69
|
+
|
70
|
+
# For unary-unary calls, log after the call immediately
|
71
|
+
if method_handler.unary_unary:
|
72
|
+
unary_response, error = None, None
|
73
|
+
try:
|
74
|
+
unary_response = cast(
|
75
|
+
GrpcMessage, method_handler.unary_unary(request, context)
|
76
|
+
)
|
77
|
+
except Exception as e: # pylint: disable=broad-except
|
78
|
+
error = e
|
79
|
+
raise
|
80
|
+
finally:
|
81
|
+
log_entry = self.log_plugin.compose_log_after_event(
|
82
|
+
request=request,
|
83
|
+
context=context,
|
84
|
+
user_info=shared_user_info.get(),
|
85
|
+
method_name=method_name,
|
86
|
+
response=unary_response or error,
|
87
|
+
)
|
88
|
+
self.log_plugin.write_log(log_entry)
|
89
|
+
return unary_response
|
90
|
+
|
91
|
+
# For unary-stream calls, wrap the response iterator and write the event log
|
92
|
+
# after iteration completes
|
93
|
+
if method_handler.unary_stream:
|
94
|
+
response_iterator = cast(
|
95
|
+
Iterator[GrpcMessage],
|
96
|
+
method_handler.unary_stream(request, context),
|
97
|
+
)
|
98
|
+
|
99
|
+
def response_wrapper() -> Iterator[GrpcMessage]:
|
100
|
+
stream_response, error = None, None
|
101
|
+
try:
|
102
|
+
# pylint: disable=use-yield-from
|
103
|
+
for stream_response in response_iterator:
|
104
|
+
yield stream_response
|
105
|
+
except Exception as e: # pylint: disable=broad-except
|
106
|
+
error = e
|
107
|
+
raise
|
108
|
+
finally:
|
109
|
+
# This block is executed after the client has consumed
|
110
|
+
# the entire stream, or if iteration is interrupted
|
111
|
+
log_entry = self.log_plugin.compose_log_after_event(
|
112
|
+
request=request,
|
113
|
+
context=context,
|
114
|
+
user_info=shared_user_info.get(),
|
115
|
+
method_name=method_name,
|
116
|
+
response=stream_response or error,
|
117
|
+
)
|
118
|
+
self.log_plugin.write_log(log_entry)
|
119
|
+
|
120
|
+
return response_wrapper()
|
121
|
+
|
122
|
+
raise RuntimeError() # This line is unreachable
|
123
|
+
|
124
|
+
if method_handler.unary_unary:
|
125
|
+
message_handler = grpc.unary_unary_rpc_method_handler
|
126
|
+
elif method_handler.unary_stream:
|
127
|
+
message_handler = grpc.unary_stream_rpc_method_handler
|
128
|
+
else:
|
129
|
+
# If the method type is not `unary_unary` or `unary_stream`, raise an error
|
130
|
+
raise NotImplementedError("This RPC method type is not supported.")
|
131
|
+
return message_handler(
|
132
|
+
_generic_method_handler,
|
133
|
+
request_deserializer=method_handler.request_deserializer,
|
134
|
+
response_serializer=method_handler.response_serializer,
|
135
|
+
)
|
@@ -15,11 +15,13 @@
|
|
15
15
|
"""Flower Exec API interceptor."""
|
16
16
|
|
17
17
|
|
18
|
-
|
18
|
+
import contextvars
|
19
|
+
from typing import Any, Callable, Union, cast
|
19
20
|
|
20
21
|
import grpc
|
21
22
|
|
22
23
|
from flwr.common.auth_plugin import ExecAuthPlugin
|
24
|
+
from flwr.common.typing import UserInfo
|
23
25
|
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
24
26
|
GetAuthTokensRequest,
|
25
27
|
GetAuthTokensResponse,
|
@@ -43,6 +45,11 @@ Response = Union[
|
|
43
45
|
]
|
44
46
|
|
45
47
|
|
48
|
+
shared_user_info: contextvars.ContextVar[UserInfo] = contextvars.ContextVar(
|
49
|
+
"user_info", default=UserInfo(user_id=None, user_name=None)
|
50
|
+
)
|
51
|
+
|
52
|
+
|
46
53
|
class ExecUserAuthInterceptor(grpc.ServerInterceptor): # type: ignore
|
47
54
|
"""Exec API interceptor for user authentication."""
|
48
55
|
|
@@ -77,13 +84,22 @@ class ExecUserAuthInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
77
84
|
) -> Response:
|
78
85
|
call = method_handler.unary_unary or method_handler.unary_stream
|
79
86
|
metadata = context.invocation_metadata()
|
87
|
+
|
88
|
+
# Intercept GetLoginDetails and GetAuthTokens requests, and return
|
89
|
+
# the response without authentication
|
80
90
|
if isinstance(request, (GetLoginDetailsRequest, GetAuthTokensRequest)):
|
81
91
|
return call(request, context) # type: ignore
|
82
92
|
|
83
|
-
|
93
|
+
# For other requests, check if the user is authenticated
|
94
|
+
valid_tokens, user_info = self.auth_plugin.validate_tokens_in_metadata(
|
95
|
+
metadata
|
96
|
+
)
|
84
97
|
if valid_tokens:
|
98
|
+
# Store user info in contextvars for authenticated users
|
99
|
+
shared_user_info.set(cast(UserInfo, user_info))
|
85
100
|
return call(request, context) # type: ignore
|
86
101
|
|
102
|
+
# If the user is not authenticated, refresh tokens
|
87
103
|
tokens = self.auth_plugin.refresh_tokens(context.invocation_metadata())
|
88
104
|
if tokens is not None:
|
89
105
|
context.send_initial_metadata(tokens)
|
{flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/RECORD
RENAMED
@@ -35,7 +35,7 @@ flwr/cli/new/templates/app/code/client.sklearn.py.tpl,sha256=MfhMN-hayGCc3cZ1XpN
|
|
35
35
|
flwr/cli/new/templates/app/code/client.tensorflow.py.tpl,sha256=yBiiU7B9Kf70U52cPkNs_dUpYrrTwbUi2os-PAyheaM,1680
|
36
36
|
flwr/cli/new/templates/app/code/dataset.baseline.py.tpl,sha256=jbd_exHAk2-Blu_kVutjPO6a_dkJQWb232zxSeXIZ1k,1453
|
37
37
|
flwr/cli/new/templates/app/code/flwr_tune/__init__.py,sha256=JgNgBtKdm1jKM9625WxappCAVUGtYAmcjKSsXJ1u3ZQ,748
|
38
|
-
flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=
|
38
|
+
flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl,sha256=tUyEAmkuUYop7teKNUO2NVbEB7-sXZBNLks8s6Wedws,3759
|
39
39
|
flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl,sha256=1NA2Sf-EviNtOaYN4dnFk6v2tcZVsY3-eXY84wOXVng,3059
|
40
40
|
flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl,sha256=ONJw_BgBWEofVNGRDu8KAIThb8saRQlUEK4uS2u_6To,2449
|
41
41
|
flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl,sha256=xkmmBKr0oGmewP56SP3s_6FG6JOVlGlquhg3a9nYMis,3270
|
@@ -58,15 +58,15 @@ flwr/cli/new/templates/app/code/task.pytorch.py.tpl,sha256=XlJqA4Ix_PloO_zJLhjiN
|
|
58
58
|
flwr/cli/new/templates/app/code/task.sklearn.py.tpl,sha256=SeIIo0rr_6ffn4Qx2xELD18jYXCkcW__NWtYEDXCICM,1843
|
59
59
|
flwr/cli/new/templates/app/code/task.tensorflow.py.tpl,sha256=SKXAZdgBnPpbAbJ90Rb7oQ5ilnopBx_j_JNFoUDeEAI,1732
|
60
60
|
flwr/cli/new/templates/app/code/utils.baseline.py.tpl,sha256=YkHAgppUeD2BnBoGfVB6dEvBfjuIPGsU1gw4CiUi3qA,40
|
61
|
-
flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=
|
62
|
-
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=
|
63
|
-
flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=
|
64
|
-
flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=
|
65
|
-
flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=
|
66
|
-
flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=
|
67
|
-
flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=
|
68
|
-
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=
|
69
|
-
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=
|
61
|
+
flwr/cli/new/templates/app/pyproject.baseline.toml.tpl,sha256=yJRlxNVsQNponM6WhpgZ0WlOS2QtiR-U00fvQBqhrmg,2666
|
62
|
+
flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=VkLWj_38YTnaCVWUoqg7q6Aaa3LECOnqi5aA2M2c_QE,1873
|
63
|
+
flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=8vW9CjTWAZ7iXH4G4sgViwJBCVCOPlirP7v8EFsghYU,1143
|
64
|
+
flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=juNBqFEcD8pbq3GQrigwNTTLa98V6yxWHXASnR60QtA,673
|
65
|
+
flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=CSGq5wen4BpbftVDz43mZr9WFE7ffsP_T5etKWehsu8,744
|
66
|
+
flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=ParO1hGe_65VJYAHYXdzUgXW3Wv-IWuCq6981sT2E7E,611
|
67
|
+
flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=7qIeXECaC8lTlyKgSnE5qZGmVwxC75zRMOfX0OOtFsY,710
|
68
|
+
flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=ds40KOWf1RnkJ-_uQCp3QzdIYMMbDsvXhHMboZGlL_o,686
|
69
|
+
flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=_q5F8w-oOC-oDIpPTd7ejMhfGtAffKMiXlE5H6B_3KQ,710
|
70
70
|
flwr/cli/run/__init__.py,sha256=cCsKVB0SFzh2b3QmGba6BHckB85xlhjh3mh4pBpACtY,790
|
71
71
|
flwr/cli/run/run.py,sha256=kEOYKin9qPJy8SODxcAvIWk-OskKPsxvcbvhDhf2VD4,8299
|
72
72
|
flwr/cli/stop.py,sha256=E4TGynmYQss5iWJ_fjSdYIW8nrNta2KOiK4sfvHKO_g,4976
|
@@ -74,9 +74,9 @@ flwr/cli/utils.py,sha256=D9XcpxzwkGPNdwX16o0kI-sYnRDMlWYyKNIpz6npRhQ,11236
|
|
74
74
|
flwr/client/__init__.py,sha256=DGDoO0AEAfz-0CUFmLdyUUweAS64-07AOnmDfWUefK4,1192
|
75
75
|
flwr/client/app.py,sha256=tNnef5wGVfqMiiGiWzAuULyy1QpvCKukiRmNi_a2cQc,34261
|
76
76
|
flwr/client/client.py,sha256=8o58nd9o6ZFcMIaVYPGcV4MSjBG4H0oFgWiv8ZEO3oA,7895
|
77
|
-
flwr/client/client_app.py,sha256=
|
77
|
+
flwr/client/client_app.py,sha256=mRj5AXokCV9WYivgkNEdBPUHXjNr_ZOQ50Dou0REhkw,14481
|
78
78
|
flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
|
79
|
-
flwr/client/clientapp/app.py,sha256=
|
79
|
+
flwr/client/clientapp/app.py,sha256=B3GrIMP8BMvltYf4n4xbtlRR1jEPT5-F93KnBCPuPJM,9069
|
80
80
|
flwr/client/clientapp/clientappio_servicer.py,sha256=5L6bjw_j3Mnx9kRFwYwxDNABKurBO5q1jZOWE_X11wQ,8522
|
81
81
|
flwr/client/clientapp/utils.py,sha256=qqTw9PKPCldGnnbAbMhtS-Qs_GcqADE1eOtVPXeKYAo,4344
|
82
82
|
flwr/client/dpfedavg_numpy_client.py,sha256=4KsEvzavDKyVDU1V0kMqffTwu1lNdUCYQN-i0DTYVN8,7404
|
@@ -107,8 +107,8 @@ flwr/client/numpy_client.py,sha256=chTkL9dOtK_wgUoYtzp5mfDOC1k8xPAd1qPIsB3hcjA,9
|
|
107
107
|
flwr/client/rest_client/__init__.py,sha256=5KGlp7pjc1dhNRkKlaNtUfQmg8wrRFh9lS3P3uRS-7Q,735
|
108
108
|
flwr/client/rest_client/connection.py,sha256=c0mHsNXHAsbX4zNelbGd2qrV3vj90FfNE6FsiD6JzuY,12904
|
109
109
|
flwr/client/run_info_store.py,sha256=ZN2Phi4DSLbSyzg8RmzJcVYh1g6eurHOmWRCT7GMtw4,4040
|
110
|
-
flwr/client/supernode/__init__.py,sha256=
|
111
|
-
flwr/client/supernode/app.py,sha256=
|
110
|
+
flwr/client/supernode/__init__.py,sha256=D5swXxemuRbA2rB_T9B8LwJW-_PucXwmlFQQerwIUv0,793
|
111
|
+
flwr/client/supernode/app.py,sha256=W1VAgvjdSgrKKgjyM04Hx5XIUGxK2Oouuh0LjavZB9E,8975
|
112
112
|
flwr/client/typing.py,sha256=dxoTBnTMfqXr5J7G3y-uNjqxYCddvxhu89spfj4Lm2U,1048
|
113
113
|
flwr/common/__init__.py,sha256=TVaoFEJE158aui1TPZQiJCDZX4RNHRyI8I55VC80HhI,3901
|
114
114
|
flwr/common/address.py,sha256=rRaN1JpiCJnit7ImEqZVxURQ69dPihRoyyWn_3I2wh4,4119
|
@@ -152,7 +152,7 @@ flwr/common/secure_aggregation/quantization.py,sha256=NE_ltC3Fx5Z3bMKqJHA95wQf2t
|
|
152
152
|
flwr/common/secure_aggregation/secaggplus_constants.py,sha256=9MF-oQh62uD7rt9VeNB-rHf2gBLd5GL3S9OejCxmILY,2183
|
153
153
|
flwr/common/secure_aggregation/secaggplus_utils.py,sha256=OgYd68YBRaHQYLc-YdExj9CSpwL58bVTaPrdHoAj2AE,3214
|
154
154
|
flwr/common/serde.py,sha256=dgPUMPoKh8r09NERMgfnZKmEiGuKVBje7bSVFwJVZyk,27340
|
155
|
-
flwr/common/telemetry.py,sha256=
|
155
|
+
flwr/common/telemetry.py,sha256=k4JVXNEZSyYF2BuKk10iH70D8RYmQEtFlVr42Ve6lls,8770
|
156
156
|
flwr/common/typing.py,sha256=Prl8_4tKnIl_Kh5UjJGbw1tnld543EkXrX0RWffJpiA,6900
|
157
157
|
flwr/common/version.py,sha256=aNSxLL49RKeLz8sPcZrsTEWtrAeQ0uxu6tjmfba4O60,1325
|
158
158
|
flwr/proto/__init__.py,sha256=hbY7JYakwZwCkYgCNlmHdc8rtvfoJbAZLalMdc--CGc,683
|
@@ -228,7 +228,7 @@ flwr/server/driver/driver.py,sha256=X072eFWl8Kx-aZbahTkpAc1wwoojr8A4uO2yozwwSbE,
|
|
228
228
|
flwr/server/driver/grpc_driver.py,sha256=u3kj9Ej5vErlRcdeF_8giqVXWLP0obT405Kjv6vC-Vw,10298
|
229
229
|
flwr/server/driver/inmemory_driver.py,sha256=p6p9RykDfoty94izzD4i11Xp7A8t1KUaHpbKbbVZAdU,6407
|
230
230
|
flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
|
231
|
-
flwr/server/run_serverapp.py,sha256=
|
231
|
+
flwr/server/run_serverapp.py,sha256=tyAYB5UEiUd63VG4XiYBUUiivh77SpIol1cGS4xtYdk,2077
|
232
232
|
flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
|
233
233
|
flwr/server/server_app.py,sha256=Kb0ayKy19awnkslwN9Jx3eBWZJvDeA8VfFBvImmMf_E,9035
|
234
234
|
flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
|
@@ -317,15 +317,16 @@ flwr/simulation/ray_transport/utils.py,sha256=wtbQhKQ4jGoiQDLJNQP17m1DSfL22ERhDB
|
|
317
317
|
flwr/simulation/run_simulation.py,sha256=KFpdL_RxE8NHZ68ZdghmFS6rccmWkO_iQ-kLLE1WUn8,20336
|
318
318
|
flwr/simulation/simulationio_connection.py,sha256=lcbEmdjb9RVEF2W5vSbf_J1zlTuv_ZAT_HLox1mqcfY,3494
|
319
319
|
flwr/superexec/__init__.py,sha256=fcj366jh4RFby_vDwLroU4kepzqbnJgseZD_jUr_Mko,715
|
320
|
-
flwr/superexec/app.py,sha256=
|
320
|
+
flwr/superexec/app.py,sha256=C0T2LMjuyF__I5V1FKfjtWtbsQPxK_EgL4vuhWIwG8s,1465
|
321
321
|
flwr/superexec/deployment.py,sha256=wZ9G42gGS91knfplswh95MnQ83Fzu-rs6wcuNgDmmvY,6735
|
322
|
+
flwr/superexec/exec_event_log_interceptor.py,sha256=zFu1MQu3XkWa9PUTQgt5wb3BL_eR2dFS5M3BR5hbX34,5805
|
322
323
|
flwr/superexec/exec_grpc.py,sha256=ttA9qoZzSLF0Mfk1L4hzOkMSNuj5rR58_kKBYwcyrAg,2864
|
323
324
|
flwr/superexec/exec_servicer.py,sha256=4UpzJqPUHkBG2PZNe2lrX7XFVDOL6yw_HcoBHxuXE9A,8349
|
324
|
-
flwr/superexec/exec_user_auth_interceptor.py,sha256=
|
325
|
+
flwr/superexec/exec_user_auth_interceptor.py,sha256=2kXjjJcrZyff893QTFLQD6zxC4pdVwtN4Rc66jHptfE,4440
|
325
326
|
flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
|
326
327
|
flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
|
327
|
-
flwr_nightly-1.
|
328
|
-
flwr_nightly-1.
|
329
|
-
flwr_nightly-1.
|
330
|
-
flwr_nightly-1.
|
331
|
-
flwr_nightly-1.
|
328
|
+
flwr_nightly-1.17.0.dev20250312.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
329
|
+
flwr_nightly-1.17.0.dev20250312.dist-info/METADATA,sha256=uOd2BEE053PBIRj-JOYG48jU4qASw1D_XJLThzPbnW4,15877
|
330
|
+
flwr_nightly-1.17.0.dev20250312.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
331
|
+
flwr_nightly-1.17.0.dev20250312.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
|
332
|
+
flwr_nightly-1.17.0.dev20250312.dist-info/RECORD,,
|
@@ -1,8 +1,5 @@
|
|
1
1
|
[console_scripts]
|
2
|
-
flower-client-app=flwr.client.supernode:run_client_app
|
3
|
-
flower-server-app=flwr.server.run_serverapp:run_server_app
|
4
2
|
flower-simulation=flwr.simulation.run_simulation:run_simulation_from_cli
|
5
|
-
flower-superexec=flwr.superexec.app:run_superexec
|
6
3
|
flower-superlink=flwr.server.app:run_superlink
|
7
4
|
flower-supernode=flwr.client.supernode.app:run_supernode
|
8
5
|
flwr=flwr.cli.app:app
|
{flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/LICENSE
RENAMED
File without changes
|
{flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/WHEEL
RENAMED
File without changes
|