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.
Files changed (24) hide show
  1. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +1 -1
  2. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  3. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  4. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  5. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  6. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  7. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  8. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  9. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  10. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  11. flwr/client/client_app.py +0 -9
  12. flwr/client/clientapp/app.py +4 -0
  13. flwr/client/supernode/__init__.py +0 -2
  14. flwr/client/supernode/app.py +1 -11
  15. flwr/common/telemetry.py +0 -10
  16. flwr/server/run_serverapp.py +2 -13
  17. flwr/superexec/app.py +0 -14
  18. flwr/superexec/exec_event_log_interceptor.py +135 -0
  19. flwr/superexec/exec_user_auth_interceptor.py +18 -2
  20. {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/METADATA +1 -1
  21. {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/RECORD +24 -23
  22. {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/entry_points.txt +0 -3
  23. {flwr_nightly-1.16.0.dev20250310.dist-info → flwr_nightly-1.17.0.dev20250312.dist-info}/LICENSE +0 -0
  24. {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
- """Standard Flower client for CNN training."""
38
+ """Flower client for LLM fine-tuning."""
39
39
 
40
40
  def __init__(
41
41
  self,
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "torchvision==0.20.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets>=0.5.0",
13
13
  "torch==2.3.1",
14
14
  "trl==0.8.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "transformers>=4.30.0,<5.0",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "jax==0.4.30",
13
13
  "jaxlib==0.4.30",
14
14
  "scikit-learn==1.6.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "mlx==0.21.1",
14
14
  ]
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "numpy>=2.0.2",
13
13
  ]
14
14
 
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "torchvision==0.20.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "scikit-learn>=1.6.1",
14
14
  ]
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "tensorflow>=2.11.1,<2.18.0",
14
14
  ]
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__(
@@ -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
@@ -15,10 +15,8 @@
15
15
  """Flower SuperNode."""
16
16
 
17
17
 
18
- from .app import run_client_app as run_client_app
19
18
  from .app import run_supernode as run_supernode
20
19
 
21
20
  __all__ = [
22
- "run_client_app",
23
21
  "run_supernode",
24
22
  ]
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  import argparse
19
- from logging import DEBUG, ERROR, INFO, WARN
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.
@@ -15,11 +15,10 @@
15
15
  """Run ServerApp."""
16
16
 
17
17
 
18
- from logging import DEBUG, ERROR
18
+ from logging import DEBUG
19
19
  from typing import Optional
20
20
 
21
- from flwr.common import Context, EventType, event
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
- from typing import Any, Callable, Union
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
- valid_tokens, _ = self.auth_plugin.validate_tokens_in_metadata(metadata)
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.16.0.dev20250310
3
+ Version: 1.17.0.dev20250312
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -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=Zgr_DwzP518E0lcGjs_togOeksdTVjwGU8sK6g8Wd0U,3765
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=66VcEv65u2o9P0N8Ys2DLA1C7hoviC7ItjRJGGXHYfk,2666
62
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl,sha256=aMGH_6H4Ki8bCTyfB2tlChCe-_LUPIVqgrRYvPXMGok,1873
63
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl,sha256=A5NfTb5imtwdAxIg5Og-cZnM8tPpFLqeI_LVJxu49pE,1143
64
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl,sha256=Sq6WZ2rSVaCh0jVxKekPTTZAhBKhGi-SHELyFwe-Z4E,673
65
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl,sha256=qDRaAmfibfIhbf43-j1kjJwpVAb-nd9o9N6KfWsyFZw,744
66
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl,sha256=_gOb3yv8XuiYNaOVY0uEO6KNoshFE8ZLvlDgbPxkqS4,611
67
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl,sha256=TNfLYgCA5vVNcmqbV2G2dsHeNjx4dXiDIcD8mNoxUMI,710
68
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl,sha256=hVII9kdYRx_sbKhQC5WHDvhPhOdO5JW-JO9CNQc-hr0,686
69
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl,sha256=ctdB84ZADY3LH6f88SX-iCSzRTDh_1vjSv-v2Oa5cgo,710
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=glgQOWgFB_6NQ3YAzekXJDoy8R5T1JPhOSiFem1-fS8,14847
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=Us5Mw3wvGd_6P1zHOf3TNcRGBBulVZDo3LuZOs17WgM,8963
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=SUhWOzcgXRNXk1V9UgB5-FaWukqqrOEajVUHEcPkwyQ,865
111
- flwr/client/supernode/app.py,sha256=oBbggh56HoieksBkTdDHAJC8VUFbrmGOP0-D9wdcZek,9265
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=APKVubU_zJNrE-M_rip6S6Fsu41DxY3tAjFWNOgTmC0,9086
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=vIPhvJx0i5sEZO4IKM6ruCXmx4ncat76rh0B4KhdhhM,2446
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=Z6kYHWd62YL0Q4YKyCAbt_BcefNfbKH6V-jCC-1NkZM,1842
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=YtvcjrD2hMVmZ3y9wHuGI6FwmG_Y__q112t4fFnypy0,3793
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.16.0.dev20250310.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
328
- flwr_nightly-1.16.0.dev20250310.dist-info/METADATA,sha256=JXB5f0sOFb-mzfNwywkCH8IYbGNt4g9Fpe5XUDmFB8c,15877
329
- flwr_nightly-1.16.0.dev20250310.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
330
- flwr_nightly-1.16.0.dev20250310.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
331
- flwr_nightly-1.16.0.dev20250310.dist-info/RECORD,,
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