flwr-nightly 1.17.0.dev20250316__py3-none-any.whl → 1.17.0.dev20250317__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/client/client_app.py CHANGED
@@ -27,7 +27,7 @@ from flwr.client.message_handler.message_handler import (
27
27
  from flwr.client.mod.utils import make_ffn
28
28
  from flwr.client.typing import ClientFnExt, Mod
29
29
  from flwr.common import Context, Message, MessageType
30
- from flwr.common.logger import warn_deprecated_feature, warn_preview_feature
30
+ from flwr.common.logger import warn_deprecated_feature
31
31
  from flwr.common.message import validate_message_type
32
32
 
33
33
  from .typing import ClientAppCallable
@@ -356,7 +356,6 @@ class ClientApp:
356
356
  lifespan_fn: Callable[[Context], Iterator[None]]
357
357
  ) -> Callable[[Context], Iterator[None]]:
358
358
  """Register the lifespan fn with the ServerApp object."""
359
- warn_preview_feature("ClientApp-register-lifespan-function")
360
359
 
361
360
  @contextmanager
362
361
  def decorated_lifespan(context: Context) -> Iterator[None]:
@@ -405,7 +404,6 @@ def _get_decorator(
405
404
  raise _registration_error(category)
406
405
 
407
406
  def decorator(fn: ClientAppCallable) -> ClientAppCallable:
408
- warn_preview_feature(f"ClientApp-register-{category}-function")
409
407
 
410
408
  # Check if the name is a valid Python identifier
411
409
  if not action.isidentifier():
@@ -18,7 +18,7 @@
18
18
  import time
19
19
  import warnings
20
20
  from collections.abc import Iterable
21
- from logging import DEBUG, WARNING
21
+ from logging import DEBUG, ERROR, WARNING
22
22
  from typing import Optional, cast
23
23
 
24
24
  import grpc
@@ -48,11 +48,32 @@ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E
48
48
 
49
49
  from .driver import Driver
50
50
 
51
- ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
52
- [flwr-serverapp] Error: Not connected.
51
+ ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED = """
53
52
 
54
- Call `connect()` on the `GrpcDriverStub` instance before calling any of the other
55
- `GrpcDriverStub` methods.
53
+ [Driver.push_messages] gRPC error occurred:
54
+
55
+ The 2GB gRPC limit has been reached. Consider reducing the number of messages pushed
56
+ at once, or push messages individually, for example:
57
+
58
+ > msgs = [msg1, msg2, msg3]
59
+ > msg_ids = []
60
+ > for msg in msgs:
61
+ > msg_id = driver.push_messages([msg])
62
+ > msg_ids.extend(msg_id)
63
+ """
64
+
65
+ ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED = """
66
+
67
+ [Driver.pull_messages] gRPC error occurred:
68
+
69
+ The 2GB gRPC limit has been reached. Consider reducing the number of messages pulled
70
+ at once, or pull messages individually, for example:
71
+
72
+ > msgs_ids = [msg_id1, msg_id2, msg_id3]
73
+ > msgs = []
74
+ > for msg_id in msg_ids:
75
+ > msg = driver.pull_messages([msg_id])
76
+ > msgs.extend(msg)
56
77
  """
57
78
 
58
79
 
@@ -206,22 +227,30 @@ class GrpcDriver(Driver):
206
227
  msg_proto = message_to_proto(msg)
207
228
  # Add to list
208
229
  message_proto_list.append(msg_proto)
209
- # Call GrpcDriverStub method
210
- res: PushInsMessagesResponse = self._stub.PushMessages(
211
- PushInsMessagesRequest(
212
- messages_list=message_proto_list, run_id=cast(Run, self._run).run_id
213
- )
214
- )
215
- if len([msg_id for msg_id in res.message_ids if msg_id]) != len(
216
- list(message_proto_list)
217
- ):
218
- log(
219
- WARNING,
220
- "Not all messages could be pushed to the SuperLink. The returned "
221
- "list has `None` for those messages (the order is preserved as passed "
222
- "to `push_messages`). This could be due to a malformed message.",
230
+
231
+ try:
232
+ # Call GrpcDriverStub method
233
+ res: PushInsMessagesResponse = self._stub.PushMessages(
234
+ PushInsMessagesRequest(
235
+ messages_list=message_proto_list, run_id=cast(Run, self._run).run_id
236
+ )
223
237
  )
224
- return list(res.message_ids)
238
+ if len([msg_id for msg_id in res.message_ids if msg_id]) != len(
239
+ message_proto_list
240
+ ):
241
+ log(
242
+ WARNING,
243
+ "Not all messages could be pushed to the SuperLink. The returned "
244
+ "list has `None` for those messages (the order is preserved as "
245
+ "passed to `push_messages`). This could be due to a malformed "
246
+ "message.",
247
+ )
248
+ return list(res.message_ids)
249
+ except grpc.RpcError as e:
250
+ if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
251
+ log(ERROR, ERROR_MESSAGE_PUSH_MESSAGES_RESOURCE_EXHAUSTED)
252
+ return []
253
+ raise
225
254
 
226
255
  def pull_messages(self, message_ids: Iterable[str]) -> Iterable[Message]:
227
256
  """Pull messages based on message IDs.
@@ -229,16 +258,22 @@ class GrpcDriver(Driver):
229
258
  This method is used to collect messages from the SuperLink that correspond to a
230
259
  set of given message IDs.
231
260
  """
232
- # Pull Messages
233
- res: PullResMessagesResponse = self._stub.PullMessages(
234
- PullResMessagesRequest(
235
- message_ids=message_ids,
236
- run_id=cast(Run, self._run).run_id,
261
+ try:
262
+ # Pull Messages
263
+ res: PullResMessagesResponse = self._stub.PullMessages(
264
+ PullResMessagesRequest(
265
+ message_ids=message_ids,
266
+ run_id=cast(Run, self._run).run_id,
267
+ )
237
268
  )
238
- )
239
- # Convert Message from Protobuf representation
240
- msgs = [message_from_proto(msg_proto) for msg_proto in res.messages_list]
241
- return msgs
269
+ # Convert Message from Protobuf representation
270
+ msgs = [message_from_proto(msg_proto) for msg_proto in res.messages_list]
271
+ return msgs
272
+ except grpc.RpcError as e:
273
+ if e.code() == grpc.StatusCode.RESOURCE_EXHAUSTED: # pylint: disable=E1101
274
+ log(ERROR, ERROR_MESSAGE_PULL_MESSAGES_RESOURCE_EXHAUSTED)
275
+ return []
276
+ raise
242
277
 
243
278
  def send_and_receive(
244
279
  self,
flwr/server/server_app.py CHANGED
@@ -20,10 +20,7 @@ from contextlib import contextmanager
20
20
  from typing import Callable, Optional
21
21
 
22
22
  from flwr.common import Context
23
- from flwr.common.logger import (
24
- warn_deprecated_feature_with_example,
25
- warn_preview_feature,
26
- )
23
+ from flwr.common.logger import warn_deprecated_feature_with_example
27
24
  from flwr.server.strategy import Strategy
28
25
 
29
26
  from .client_manager import ClientManager
@@ -176,8 +173,6 @@ class ServerApp: # pylint: disable=too-many-instance-attributes
176
173
  """,
177
174
  )
178
175
 
179
- warn_preview_feature("ServerApp-register-main-function")
180
-
181
176
  # Register provided function with the ServerApp object
182
177
  self._main = main_fn
183
178
 
@@ -215,7 +210,6 @@ class ServerApp: # pylint: disable=too-many-instance-attributes
215
210
  lifespan_fn: Callable[[Context], Iterator[None]]
216
211
  ) -> Callable[[Context], Iterator[None]]:
217
212
  """Register the lifespan fn with the ServerApp object."""
218
- warn_preview_feature("ServerApp-register-lifespan-function")
219
213
 
220
214
  @contextmanager
221
215
  def decorated_lifespan(context: Context) -> Iterator[None]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.17.0.dev20250316
3
+ Version: 1.17.0.dev20250317
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -63,7 +63,7 @@ Description-Content-Type: text/markdown
63
63
  <a href="https://flower.ai/">Website</a> |
64
64
  <a href="https://flower.ai/blog">Blog</a> |
65
65
  <a href="https://flower.ai/docs/">Docs</a> |
66
- <a href="https://flower.ai/conf/flower-summit-2022">Conference</a> |
66
+ <a href="https://flower.ai/events/flower-ai-summit-2025">Summit</a> |
67
67
  <a href="https://flower.ai/join-slack">Slack</a>
68
68
  <br /><br />
69
69
  </p>
@@ -74,7 +74,7 @@ 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=8PpAlN7KT8oNFBFVWbGGi39Zw-fhKBZYLGAs4s1aMdY,17312
77
+ flwr/client/client_app.py,sha256=iuQSO-iwRjWzpeWOjeYKmvfIpBxoGnIAU2TgsmqLpyo,17145
78
78
  flwr/client/clientapp/__init__.py,sha256=kZqChGnTChQ1WGSUkIlW2S5bc0d0mzDubCAmZUGRpEY,800
79
79
  flwr/client/clientapp/app.py,sha256=B3GrIMP8BMvltYf4n4xbtlRR1jEPT5-F93KnBCPuPJM,9069
80
80
  flwr/client/clientapp/clientappio_servicer.py,sha256=5L6bjw_j3Mnx9kRFwYwxDNABKurBO5q1jZOWE_X11wQ,8522
@@ -225,13 +225,13 @@ flwr/server/compat/legacy_context.py,sha256=wBzBcfV6YO6IQGriM_FdJ5XZfiBBEEJdS_Od
225
225
  flwr/server/criterion.py,sha256=ypbAexbztzGUxNen9RCHF91QeqiEQix4t4Ih3E-42MM,1061
226
226
  flwr/server/driver/__init__.py,sha256=bikRv6CjTwSvYh7tf10gziU5o2YotOWhhftz2tr3KDc,886
227
227
  flwr/server/driver/driver.py,sha256=X072eFWl8Kx-aZbahTkpAc1wwoojr8A4uO2yozwwSbE,5705
228
- flwr/server/driver/grpc_driver.py,sha256=u3kj9Ej5vErlRcdeF_8giqVXWLP0obT405Kjv6vC-Vw,10298
228
+ flwr/server/driver/grpc_driver.py,sha256=rbSqFhT2ULLQhgIeX24Yt1wZje4bzV4EUoOmbIuVYro,11507
229
229
  flwr/server/driver/inmemory_driver.py,sha256=p6p9RykDfoty94izzD4i11Xp7A8t1KUaHpbKbbVZAdU,6407
230
230
  flwr/server/fleet_event_log_interceptor.py,sha256=AkL7Y5d3xm2vRhL3ahmEVVoOvAP7PA7dRgB-je4v-Ys,3774
231
231
  flwr/server/history.py,sha256=qSb5_pPTrwofpSYGsZWzMPkl_4uJ4mJFWesxXDrEvDU,5026
232
232
  flwr/server/run_serverapp.py,sha256=tyAYB5UEiUd63VG4XiYBUUiivh77SpIol1cGS4xtYdk,2077
233
233
  flwr/server/server.py,sha256=1ZsFEptmAV-L2vP2etNC9Ed5CLSxpuKzUFkAPQ4l5Xc,17893
234
- flwr/server/server_app.py,sha256=Kb0ayKy19awnkslwN9Jx3eBWZJvDeA8VfFBvImmMf_E,9035
234
+ flwr/server/server_app.py,sha256=y6v1WEE7fkJbO9VNGafznm3QfUM3ifpdBcgauKmB4hU,8857
235
235
  flwr/server/server_config.py,sha256=CZaHVAsMvGLjpWVcLPkiYxgJN4xfIyAiUrCI3fETKY4,1349
236
236
  flwr/server/serverapp/__init__.py,sha256=L0K-94UDdTyEZ8LDtYybGIIIv3HW6AhSVjXMUfYJQnQ,800
237
237
  flwr/server/serverapp/app.py,sha256=5nFRYYzC2vh0l1fKJofBfKwFam93In4b80wvH9eFfQ8,8651
@@ -326,8 +326,8 @@ flwr/superexec/exec_servicer.py,sha256=4UpzJqPUHkBG2PZNe2lrX7XFVDOL6yw_HcoBHxuXE
326
326
  flwr/superexec/exec_user_auth_interceptor.py,sha256=2kXjjJcrZyff893QTFLQD6zxC4pdVwtN4Rc66jHptfE,4440
327
327
  flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
328
328
  flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
329
- flwr_nightly-1.17.0.dev20250316.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
330
- flwr_nightly-1.17.0.dev20250316.dist-info/METADATA,sha256=TnKc9Jev3kwItLFLia2uS8FGkO_wKw1BrR0maimYi3Y,15877
331
- flwr_nightly-1.17.0.dev20250316.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
332
- flwr_nightly-1.17.0.dev20250316.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
333
- flwr_nightly-1.17.0.dev20250316.dist-info/RECORD,,
329
+ flwr_nightly-1.17.0.dev20250317.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
330
+ flwr_nightly-1.17.0.dev20250317.dist-info/METADATA,sha256=BK-20xmip40rp16IosnE5QCL4tnXqfYn0Td2M8Crka8,15878
331
+ flwr_nightly-1.17.0.dev20250317.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
332
+ flwr_nightly-1.17.0.dev20250317.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
333
+ flwr_nightly-1.17.0.dev20250317.dist-info/RECORD,,