flwr 1.23.0__py3-none-any.whl → 1.24.0__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 (292) hide show
  1. flwr/__init__.py +16 -5
  2. flwr/app/error.py +2 -2
  3. flwr/app/exception.py +3 -3
  4. flwr/cli/app.py +19 -0
  5. flwr/cli/app_cmd/__init__.py +23 -0
  6. flwr/cli/app_cmd/publish.py +285 -0
  7. flwr/cli/app_cmd/review.py +252 -0
  8. flwr/cli/auth_plugin/auth_plugin.py +4 -5
  9. flwr/cli/auth_plugin/noop_auth_plugin.py +54 -11
  10. flwr/cli/auth_plugin/oidc_cli_plugin.py +32 -9
  11. flwr/cli/build.py +60 -18
  12. flwr/cli/cli_account_auth_interceptor.py +24 -7
  13. flwr/cli/config_utils.py +101 -13
  14. flwr/cli/federation/__init__.py +24 -0
  15. flwr/cli/federation/ls.py +140 -0
  16. flwr/cli/federation/show.py +317 -0
  17. flwr/cli/install.py +91 -13
  18. flwr/cli/log.py +52 -9
  19. flwr/cli/login/login.py +7 -4
  20. flwr/cli/ls.py +170 -130
  21. flwr/cli/new/new.py +33 -50
  22. flwr/cli/new/templates/app/code/task.pytorch.py.tpl +1 -0
  23. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  24. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  25. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  26. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  27. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  28. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  29. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +3 -3
  30. flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +1 -1
  31. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  32. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +2 -2
  33. flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +1 -1
  34. flwr/cli/pull.py +10 -5
  35. flwr/cli/run/run.py +77 -30
  36. flwr/cli/run_utils.py +130 -0
  37. flwr/cli/stop.py +25 -7
  38. flwr/cli/supernode/ls.py +16 -8
  39. flwr/cli/supernode/register.py +9 -4
  40. flwr/cli/supernode/unregister.py +5 -3
  41. flwr/cli/utils.py +376 -16
  42. flwr/client/__init__.py +1 -1
  43. flwr/client/dpfedavg_numpy_client.py +4 -1
  44. flwr/client/grpc_adapter_client/connection.py +6 -7
  45. flwr/client/grpc_rere_client/connection.py +10 -11
  46. flwr/client/grpc_rere_client/grpc_adapter.py +6 -2
  47. flwr/client/grpc_rere_client/node_auth_client_interceptor.py +2 -1
  48. flwr/client/message_handler/message_handler.py +2 -2
  49. flwr/client/mod/secure_aggregation/secaggplus_mod.py +3 -3
  50. flwr/client/numpy_client.py +1 -1
  51. flwr/client/rest_client/connection.py +12 -14
  52. flwr/client/run_info_store.py +4 -5
  53. flwr/client/typing.py +1 -1
  54. flwr/clientapp/client_app.py +9 -10
  55. flwr/clientapp/mod/centraldp_mods.py +16 -17
  56. flwr/clientapp/mod/localdp_mod.py +8 -9
  57. flwr/clientapp/typing.py +1 -1
  58. flwr/clientapp/utils.py +3 -3
  59. flwr/common/address.py +1 -2
  60. flwr/common/args.py +3 -4
  61. flwr/common/config.py +13 -16
  62. flwr/common/constant.py +5 -2
  63. flwr/common/differential_privacy.py +3 -4
  64. flwr/common/event_log_plugin/event_log_plugin.py +3 -4
  65. flwr/common/exit/exit.py +15 -2
  66. flwr/common/exit/exit_code.py +19 -0
  67. flwr/common/exit/exit_handler.py +6 -2
  68. flwr/common/exit/signal_handler.py +5 -5
  69. flwr/common/grpc.py +6 -6
  70. flwr/common/inflatable_protobuf_utils.py +1 -1
  71. flwr/common/inflatable_utils.py +38 -21
  72. flwr/common/logger.py +19 -19
  73. flwr/common/message.py +4 -4
  74. flwr/common/object_ref.py +7 -7
  75. flwr/common/record/array.py +3 -3
  76. flwr/common/record/arrayrecord.py +18 -30
  77. flwr/common/record/configrecord.py +3 -3
  78. flwr/common/record/recorddict.py +5 -5
  79. flwr/common/record/typeddict.py +9 -2
  80. flwr/common/recorddict_compat.py +7 -10
  81. flwr/common/retry_invoker.py +20 -20
  82. flwr/common/secure_aggregation/ndarrays_arithmetic.py +3 -3
  83. flwr/common/serde.py +5 -4
  84. flwr/common/serde_utils.py +2 -2
  85. flwr/common/telemetry.py +9 -5
  86. flwr/common/typing.py +52 -37
  87. flwr/compat/client/app.py +38 -37
  88. flwr/compat/client/grpc_client/connection.py +11 -11
  89. flwr/compat/server/app.py +5 -6
  90. flwr/proto/appio_pb2.py +13 -3
  91. flwr/proto/appio_pb2.pyi +134 -65
  92. flwr/proto/appio_pb2_grpc.py +20 -0
  93. flwr/proto/appio_pb2_grpc.pyi +27 -0
  94. flwr/proto/clientappio_pb2.py +17 -7
  95. flwr/proto/clientappio_pb2.pyi +15 -0
  96. flwr/proto/clientappio_pb2_grpc.py +206 -40
  97. flwr/proto/clientappio_pb2_grpc.pyi +168 -53
  98. flwr/proto/control_pb2.py +71 -52
  99. flwr/proto/control_pb2.pyi +277 -111
  100. flwr/proto/control_pb2_grpc.py +249 -40
  101. flwr/proto/control_pb2_grpc.pyi +185 -52
  102. flwr/proto/error_pb2.py +13 -3
  103. flwr/proto/error_pb2.pyi +24 -6
  104. flwr/proto/error_pb2_grpc.py +20 -0
  105. flwr/proto/error_pb2_grpc.pyi +27 -0
  106. flwr/proto/fab_pb2.py +14 -4
  107. flwr/proto/fab_pb2.pyi +59 -31
  108. flwr/proto/fab_pb2_grpc.py +20 -0
  109. flwr/proto/fab_pb2_grpc.pyi +27 -0
  110. flwr/proto/federation_pb2.py +38 -0
  111. flwr/proto/federation_pb2.pyi +56 -0
  112. flwr/proto/federation_pb2_grpc.py +24 -0
  113. flwr/proto/federation_pb2_grpc.pyi +31 -0
  114. flwr/proto/fleet_pb2.py +14 -4
  115. flwr/proto/fleet_pb2.pyi +137 -61
  116. flwr/proto/fleet_pb2_grpc.py +189 -48
  117. flwr/proto/fleet_pb2_grpc.pyi +175 -61
  118. flwr/proto/grpcadapter_pb2.py +14 -4
  119. flwr/proto/grpcadapter_pb2.pyi +38 -16
  120. flwr/proto/grpcadapter_pb2_grpc.py +35 -4
  121. flwr/proto/grpcadapter_pb2_grpc.pyi +38 -7
  122. flwr/proto/heartbeat_pb2.py +17 -7
  123. flwr/proto/heartbeat_pb2.pyi +51 -22
  124. flwr/proto/heartbeat_pb2_grpc.py +20 -0
  125. flwr/proto/heartbeat_pb2_grpc.pyi +27 -0
  126. flwr/proto/log_pb2.py +13 -3
  127. flwr/proto/log_pb2.pyi +34 -11
  128. flwr/proto/log_pb2_grpc.py +20 -0
  129. flwr/proto/log_pb2_grpc.pyi +27 -0
  130. flwr/proto/message_pb2.py +15 -5
  131. flwr/proto/message_pb2.pyi +154 -86
  132. flwr/proto/message_pb2_grpc.py +20 -0
  133. flwr/proto/message_pb2_grpc.pyi +27 -0
  134. flwr/proto/node_pb2.py +15 -5
  135. flwr/proto/node_pb2.pyi +50 -25
  136. flwr/proto/node_pb2_grpc.py +20 -0
  137. flwr/proto/node_pb2_grpc.pyi +27 -0
  138. flwr/proto/recorddict_pb2.py +13 -3
  139. flwr/proto/recorddict_pb2.pyi +184 -107
  140. flwr/proto/recorddict_pb2_grpc.py +20 -0
  141. flwr/proto/recorddict_pb2_grpc.pyi +27 -0
  142. flwr/proto/run_pb2.py +40 -31
  143. flwr/proto/run_pb2.pyi +149 -84
  144. flwr/proto/run_pb2_grpc.py +20 -0
  145. flwr/proto/run_pb2_grpc.pyi +27 -0
  146. flwr/proto/serverappio_pb2.py +13 -3
  147. flwr/proto/serverappio_pb2.pyi +32 -8
  148. flwr/proto/serverappio_pb2_grpc.py +246 -65
  149. flwr/proto/serverappio_pb2_grpc.pyi +221 -85
  150. flwr/proto/simulationio_pb2.py +16 -8
  151. flwr/proto/simulationio_pb2.pyi +15 -0
  152. flwr/proto/simulationio_pb2_grpc.py +162 -41
  153. flwr/proto/simulationio_pb2_grpc.pyi +149 -55
  154. flwr/proto/transport_pb2.py +20 -10
  155. flwr/proto/transport_pb2.pyi +249 -160
  156. flwr/proto/transport_pb2_grpc.py +35 -4
  157. flwr/proto/transport_pb2_grpc.pyi +38 -8
  158. flwr/server/app.py +38 -17
  159. flwr/server/client_manager.py +4 -5
  160. flwr/server/client_proxy.py +10 -11
  161. flwr/server/compat/app.py +4 -5
  162. flwr/server/compat/app_utils.py +2 -1
  163. flwr/server/compat/grid_client_proxy.py +10 -12
  164. flwr/server/compat/legacy_context.py +3 -4
  165. flwr/server/fleet_event_log_interceptor.py +2 -1
  166. flwr/server/grid/grid.py +2 -3
  167. flwr/server/grid/grpc_grid.py +10 -8
  168. flwr/server/grid/inmemory_grid.py +4 -4
  169. flwr/server/run_serverapp.py +2 -3
  170. flwr/server/server.py +34 -39
  171. flwr/server/server_app.py +7 -8
  172. flwr/server/server_config.py +1 -2
  173. flwr/server/serverapp/app.py +34 -28
  174. flwr/server/serverapp_components.py +4 -5
  175. flwr/server/strategy/aggregate.py +9 -8
  176. flwr/server/strategy/bulyan.py +13 -11
  177. flwr/server/strategy/dp_adaptive_clipping.py +16 -20
  178. flwr/server/strategy/dp_fixed_clipping.py +12 -17
  179. flwr/server/strategy/dpfedavg_adaptive.py +3 -4
  180. flwr/server/strategy/dpfedavg_fixed.py +6 -10
  181. flwr/server/strategy/fault_tolerant_fedavg.py +14 -13
  182. flwr/server/strategy/fedadagrad.py +18 -14
  183. flwr/server/strategy/fedadam.py +16 -14
  184. flwr/server/strategy/fedavg.py +16 -17
  185. flwr/server/strategy/fedavg_android.py +15 -15
  186. flwr/server/strategy/fedavgm.py +21 -18
  187. flwr/server/strategy/fedmedian.py +2 -3
  188. flwr/server/strategy/fedopt.py +11 -10
  189. flwr/server/strategy/fedprox.py +10 -9
  190. flwr/server/strategy/fedtrimmedavg.py +12 -11
  191. flwr/server/strategy/fedxgb_bagging.py +13 -11
  192. flwr/server/strategy/fedxgb_cyclic.py +6 -6
  193. flwr/server/strategy/fedxgb_nn_avg.py +4 -4
  194. flwr/server/strategy/fedyogi.py +16 -14
  195. flwr/server/strategy/krum.py +12 -11
  196. flwr/server/strategy/qfedavg.py +16 -15
  197. flwr/server/strategy/strategy.py +6 -9
  198. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +2 -1
  199. flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -2
  200. flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +3 -4
  201. flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +10 -12
  202. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +1 -3
  203. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +4 -4
  204. flwr/server/superlink/fleet/grpc_rere/node_auth_server_interceptor.py +3 -2
  205. flwr/server/superlink/fleet/message_handler/message_handler.py +34 -28
  206. flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -2
  207. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  208. flwr/server/superlink/fleet/vce/backend/raybackend.py +5 -5
  209. flwr/server/superlink/fleet/vce/vce_api.py +15 -9
  210. flwr/server/superlink/linkstate/in_memory_linkstate.py +115 -150
  211. flwr/server/superlink/linkstate/linkstate.py +59 -43
  212. flwr/server/superlink/linkstate/linkstate_factory.py +22 -5
  213. flwr/server/superlink/linkstate/sqlite_linkstate.py +447 -438
  214. flwr/server/superlink/linkstate/utils.py +6 -6
  215. flwr/server/superlink/serverappio/serverappio_grpc.py +1 -2
  216. flwr/server/superlink/serverappio/serverappio_servicer.py +26 -21
  217. flwr/server/superlink/simulation/simulationio_grpc.py +1 -2
  218. flwr/server/superlink/simulation/simulationio_servicer.py +18 -13
  219. flwr/server/superlink/utils.py +4 -6
  220. flwr/server/typing.py +1 -1
  221. flwr/server/utils/tensorboard.py +15 -8
  222. flwr/server/workflow/default_workflows.py +5 -5
  223. flwr/server/workflow/secure_aggregation/secagg_workflow.py +2 -4
  224. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +8 -8
  225. flwr/serverapp/strategy/bulyan.py +16 -15
  226. flwr/serverapp/strategy/dp_adaptive_clipping.py +12 -11
  227. flwr/serverapp/strategy/dp_fixed_clipping.py +11 -14
  228. flwr/serverapp/strategy/fedadagrad.py +10 -11
  229. flwr/serverapp/strategy/fedadam.py +10 -11
  230. flwr/serverapp/strategy/fedavg.py +9 -10
  231. flwr/serverapp/strategy/fedavgm.py +17 -16
  232. flwr/serverapp/strategy/fedmedian.py +2 -2
  233. flwr/serverapp/strategy/fedopt.py +10 -11
  234. flwr/serverapp/strategy/fedprox.py +7 -8
  235. flwr/serverapp/strategy/fedtrimmedavg.py +9 -9
  236. flwr/serverapp/strategy/fedxgb_bagging.py +3 -3
  237. flwr/serverapp/strategy/fedxgb_cyclic.py +9 -9
  238. flwr/serverapp/strategy/fedyogi.py +9 -11
  239. flwr/serverapp/strategy/krum.py +7 -7
  240. flwr/serverapp/strategy/multikrum.py +9 -9
  241. flwr/serverapp/strategy/qfedavg.py +17 -16
  242. flwr/serverapp/strategy/strategy.py +6 -9
  243. flwr/serverapp/strategy/strategy_utils.py +7 -8
  244. flwr/simulation/app.py +46 -42
  245. flwr/simulation/legacy_app.py +12 -12
  246. flwr/simulation/ray_transport/ray_actor.py +10 -11
  247. flwr/simulation/ray_transport/ray_client_proxy.py +11 -12
  248. flwr/simulation/run_simulation.py +43 -43
  249. flwr/simulation/simulationio_connection.py +4 -4
  250. flwr/supercore/cli/flower_superexec.py +3 -4
  251. flwr/supercore/constant.py +31 -1
  252. flwr/supercore/corestate/corestate.py +24 -3
  253. flwr/supercore/corestate/in_memory_corestate.py +138 -0
  254. flwr/supercore/corestate/sqlite_corestate.py +157 -0
  255. flwr/supercore/ffs/disk_ffs.py +1 -2
  256. flwr/supercore/ffs/ffs.py +1 -2
  257. flwr/supercore/ffs/ffs_factory.py +1 -2
  258. flwr/{common → supercore}/heartbeat.py +20 -25
  259. flwr/supercore/object_store/in_memory_object_store.py +1 -2
  260. flwr/supercore/object_store/object_store.py +1 -2
  261. flwr/supercore/object_store/object_store_factory.py +1 -2
  262. flwr/supercore/object_store/sqlite_object_store.py +8 -7
  263. flwr/supercore/primitives/asymmetric.py +1 -1
  264. flwr/supercore/primitives/asymmetric_ed25519.py +11 -1
  265. flwr/supercore/sqlite_mixin.py +37 -34
  266. flwr/supercore/superexec/plugin/base_exec_plugin.py +1 -2
  267. flwr/supercore/superexec/plugin/exec_plugin.py +3 -3
  268. flwr/supercore/superexec/run_superexec.py +9 -13
  269. flwr/superlink/artifact_provider/artifact_provider.py +1 -2
  270. flwr/superlink/auth_plugin/auth_plugin.py +6 -9
  271. flwr/superlink/auth_plugin/noop_auth_plugin.py +6 -9
  272. flwr/superlink/federation/__init__.py +24 -0
  273. flwr/superlink/federation/federation_manager.py +64 -0
  274. flwr/superlink/federation/noop_federation_manager.py +71 -0
  275. flwr/superlink/servicer/control/control_account_auth_interceptor.py +22 -13
  276. flwr/superlink/servicer/control/control_event_log_interceptor.py +7 -7
  277. flwr/superlink/servicer/control/control_grpc.py +5 -6
  278. flwr/superlink/servicer/control/control_license_interceptor.py +3 -3
  279. flwr/superlink/servicer/control/control_servicer.py +102 -18
  280. flwr/supernode/cli/flower_supernode.py +58 -3
  281. flwr/supernode/nodestate/in_memory_nodestate.py +60 -49
  282. flwr/supernode/nodestate/nodestate.py +7 -8
  283. flwr/supernode/nodestate/nodestate_factory.py +7 -4
  284. flwr/supernode/runtime/run_clientapp.py +41 -22
  285. flwr/supernode/servicer/clientappio/clientappio_servicer.py +40 -10
  286. flwr/supernode/start_client_internal.py +158 -42
  287. {flwr-1.23.0.dist-info → flwr-1.24.0.dist-info}/METADATA +8 -8
  288. flwr-1.24.0.dist-info/RECORD +454 -0
  289. flwr/supercore/object_store/utils.py +0 -43
  290. flwr-1.23.0.dist-info/RECORD +0 -439
  291. {flwr-1.23.0.dist-info → flwr-1.24.0.dist-info}/WHEEL +0 -0
  292. {flwr-1.23.0.dist-info → flwr-1.24.0.dist-info}/entry_points.txt +0 -0
flwr/compat/client/app.py CHANGED
@@ -16,10 +16,10 @@
16
16
 
17
17
 
18
18
  import time
19
+ from collections.abc import Callable
19
20
  from contextlib import AbstractContextManager
20
21
  from logging import ERROR, INFO, WARN
21
22
  from pathlib import Path
22
- from typing import Callable, Optional, Union
23
23
 
24
24
  from cryptography.hazmat.primitives.asymmetric import ec
25
25
  from grpc import RpcError
@@ -46,11 +46,12 @@ from flwr.common.logger import log, warn_deprecated_feature
46
46
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
47
47
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
48
48
  from flwr.compat.client.grpc_client.connection import grpc_connection
49
+ from flwr.supercore.object_store import ObjectStoreFactory
49
50
  from flwr.supernode.nodestate import NodeStateFactory
50
51
 
51
52
 
52
53
  def _check_actionable_client(
53
- client: Optional[Client], client_fn: Optional[ClientFnExt]
54
+ client: Client | None, client_fn: ClientFnExt | None
54
55
  ) -> None:
55
56
  if client_fn is None and client is None:
56
57
  raise ValueError(
@@ -71,17 +72,17 @@ def _check_actionable_client(
71
72
  def start_client(
72
73
  *,
73
74
  server_address: str,
74
- client_fn: Optional[ClientFnExt] = None,
75
- client: Optional[Client] = None,
75
+ client_fn: ClientFnExt | None = None,
76
+ client: Client | None = None,
76
77
  grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
77
- root_certificates: Optional[Union[bytes, str]] = None,
78
- insecure: Optional[bool] = None,
79
- transport: Optional[str] = None,
80
- authentication_keys: Optional[
81
- tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
82
- ] = None,
83
- max_retries: Optional[int] = None,
84
- max_wait_time: Optional[float] = None,
78
+ root_certificates: bytes | str | None = None,
79
+ insecure: bool | None = None,
80
+ transport: str | None = None,
81
+ authentication_keys: (
82
+ tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
83
+ ) = None,
84
+ max_retries: int | None = None,
85
+ max_wait_time: float | None = None,
85
86
  ) -> None:
86
87
  """Start a Flower client node which connects to a Flower server.
87
88
 
@@ -205,19 +206,19 @@ def start_client_internal(
205
206
  *,
206
207
  server_address: str,
207
208
  node_config: UserConfig,
208
- load_client_app_fn: Optional[Callable[[str, str, str], ClientApp]] = None,
209
- client_fn: Optional[ClientFnExt] = None,
210
- client: Optional[Client] = None,
209
+ load_client_app_fn: Callable[[str, str, str], ClientApp] | None = None,
210
+ client_fn: ClientFnExt | None = None,
211
+ client: Client | None = None,
211
212
  grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
212
- root_certificates: Optional[Union[bytes, str]] = None,
213
- insecure: Optional[bool] = None,
214
- transport: Optional[str] = None,
215
- authentication_keys: Optional[
216
- tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
217
- ] = None,
218
- max_retries: Optional[int] = None,
219
- max_wait_time: Optional[float] = None,
220
- flwr_path: Optional[Path] = None,
213
+ root_certificates: bytes | str | None = None,
214
+ insecure: bool | None = None,
215
+ transport: str | None = None,
216
+ authentication_keys: (
217
+ tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
218
+ ) = None,
219
+ max_retries: int | None = None,
220
+ max_wait_time: float | None = None,
221
+ flwr_path: Path | None = None,
221
222
  ) -> None:
222
223
  """Start a Flower client node which connects to a Flower server.
223
224
 
@@ -342,8 +343,8 @@ def start_client_internal(
342
343
  )
343
344
 
344
345
  # DeprecatedRunInfoStore gets initialized when the first connection is established
345
- run_info_store: Optional[DeprecatedRunInfoStore] = None
346
- state_factory = NodeStateFactory()
346
+ run_info_store: DeprecatedRunInfoStore | None = None
347
+ state_factory = NodeStateFactory(objectstore_factory=ObjectStoreFactory())
347
348
  state = state_factory.state()
348
349
 
349
350
  runs: dict[int, Run] = {}
@@ -537,9 +538,9 @@ def start_numpy_client(
537
538
  server_address: str,
538
539
  client: NumPyClient,
539
540
  grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
540
- root_certificates: Optional[bytes] = None,
541
- insecure: Optional[bool] = None,
542
- transport: Optional[str] = None,
541
+ root_certificates: bytes | None = None,
542
+ insecure: bool | None = None,
543
+ transport: str | None = None,
543
544
  ) -> None:
544
545
  """Start a Flower NumPyClient which connects to a gRPC server.
545
546
 
@@ -631,24 +632,24 @@ def start_numpy_client(
631
632
  )
632
633
 
633
634
 
634
- def _init_connection(transport: Optional[str], server_address: str) -> tuple[
635
+ def _init_connection(transport: str | None, server_address: str) -> tuple[
635
636
  Callable[
636
637
  [
637
638
  str,
638
639
  bool,
639
640
  RetryInvoker,
640
641
  int,
641
- Union[bytes, str, None],
642
- Optional[tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]],
642
+ bytes | str | None,
643
+ tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None,
643
644
  ],
644
645
  AbstractContextManager[
645
646
  tuple[
646
- Callable[[], Optional[Message]],
647
+ Callable[[], Message | None],
647
648
  Callable[[Message], None],
648
- Optional[Callable[[], Optional[int]]],
649
- Optional[Callable[[], None]],
650
- Optional[Callable[[int], Run]],
651
- Optional[Callable[[str, int], Fab]],
649
+ Callable[[], int | None] | None,
650
+ Callable[[], None] | None,
651
+ Callable[[int], Run] | None,
652
+ Callable[[str, int], Fab] | None,
652
653
  ]
653
654
  ],
654
655
  ],
@@ -16,12 +16,12 @@
16
16
 
17
17
 
18
18
  import uuid
19
- from collections.abc import Iterator
19
+ from collections.abc import Callable, Iterator
20
20
  from contextlib import contextmanager
21
21
  from logging import DEBUG, ERROR
22
22
  from pathlib import Path
23
23
  from queue import Queue
24
- from typing import Callable, Optional, Union, cast
24
+ from typing import cast
25
25
 
26
26
  from cryptography.hazmat.primitives.asymmetric import ec
27
27
 
@@ -56,18 +56,18 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
56
56
  insecure: bool,
57
57
  retry_invoker: RetryInvoker, # pylint: disable=unused-argument
58
58
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
59
- root_certificates: Optional[Union[bytes, str]] = None,
60
- authentication_keys: Optional[ # pylint: disable=unused-argument
61
- tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
62
- ] = None,
59
+ root_certificates: bytes | str | None = None,
60
+ authentication_keys: (
61
+ tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
62
+ ) = None,
63
63
  ) -> Iterator[
64
64
  tuple[
65
- Callable[[], Optional[Message]],
65
+ Callable[[], Message | None],
66
66
  Callable[[Message], None],
67
- Optional[Callable[[], Optional[int]]],
68
- Optional[Callable[[], None]],
69
- Optional[Callable[[int], Run]],
70
- Optional[Callable[[str, int], Fab]],
67
+ Callable[[], int | None] | None,
68
+ Callable[[], None] | None,
69
+ Callable[[int], Run] | None,
70
+ Callable[[str, int], Fab] | None,
71
71
  ]
72
72
  ]:
73
73
  """Establish a gRPC connection to a gRPC server.
flwr/compat/server/app.py CHANGED
@@ -17,7 +17,6 @@
17
17
 
18
18
  import sys
19
19
  from logging import INFO
20
- from typing import Optional
21
20
 
22
21
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
23
22
  from flwr.common.address import parse_address
@@ -35,12 +34,12 @@ from flwr.server.superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
35
34
  def start_server( # pylint: disable=too-many-arguments,too-many-locals
36
35
  *,
37
36
  server_address: str = FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
38
- server: Optional[Server] = None,
39
- config: Optional[ServerConfig] = None,
40
- strategy: Optional[Strategy] = None,
41
- client_manager: Optional[ClientManager] = None,
37
+ server: Server | None = None,
38
+ config: ServerConfig | None = None,
39
+ strategy: Strategy | None = None,
40
+ client_manager: ClientManager | None = None,
42
41
  grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
43
- certificates: Optional[tuple[bytes, bytes, bytes]] = None,
42
+ certificates: tuple[bytes, bytes, bytes] | None = None,
44
43
  ) -> History:
45
44
  """Start a Flower server using the gRPC transport layer.
46
45
 
flwr/proto/appio_pb2.py CHANGED
@@ -1,12 +1,22 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
3
4
  # source: flwr/proto/appio.proto
4
- # Protobuf Python Version: 4.25.1
5
+ # Protobuf Python Version: 5.29.0
5
6
  """Generated protocol buffer code."""
6
7
  from google.protobuf import descriptor as _descriptor
7
8
  from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
8
10
  from google.protobuf import symbol_database as _symbol_database
9
11
  from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 0,
17
+ '',
18
+ 'flwr/proto/appio.proto'
19
+ )
10
20
  # @@protoc_insertion_point(imports)
11
21
 
12
22
  _sym_db = _symbol_database.Default()
@@ -22,8 +32,8 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/
22
32
  _globals = globals()
23
33
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
24
34
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.appio_pb2', _globals)
25
- if _descriptor._USE_C_DESCRIPTORS == False:
26
- DESCRIPTOR._options = None
35
+ if not _descriptor._USE_C_DESCRIPTORS:
36
+ DESCRIPTOR._loaded_options = None
27
37
  _globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_start=108
28
38
  _globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_end=133
29
39
  _globals['_LISTAPPSTOLAUNCHRESPONSE']._serialized_start=135
flwr/proto/appio_pb2.pyi CHANGED
@@ -1,8 +1,24 @@
1
1
  """
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
+ Copyright 2025 Flower Labs GmbH. All Rights Reserved.
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License");
7
+ you may not use this file except in compliance with the License.
8
+ You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+ ==============================================================================
4
18
  """
19
+
5
20
  import builtins
21
+ import collections.abc
6
22
  import flwr.proto.fab_pb2
7
23
  import flwr.proto.message_pb2
8
24
  import flwr.proto.run_pb2
@@ -10,145 +26,187 @@ import google.protobuf.descriptor
10
26
  import google.protobuf.internal.containers
11
27
  import google.protobuf.message
12
28
  import typing
13
- import typing_extensions
14
29
 
15
30
  DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
16
31
 
32
+ @typing.final
17
33
  class ListAppsToLaunchRequest(google.protobuf.message.Message):
18
34
  """These messages are used by both ServerAppIo and ClientAppIo services
19
35
 
20
36
  ListAppsToLaunch messages
21
37
  """
38
+
22
39
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
23
- def __init__(self,
24
- ) -> None: ...
40
+
41
+ def __init__(
42
+ self,
43
+ ) -> None: ...
44
+
25
45
  global___ListAppsToLaunchRequest = ListAppsToLaunchRequest
26
46
 
47
+ @typing.final
27
48
  class ListAppsToLaunchResponse(google.protobuf.message.Message):
28
49
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
50
+
29
51
  RUN_IDS_FIELD_NUMBER: builtins.int
30
52
  @property
31
53
  def run_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
32
54
  """List of run IDs of the apps to launch"""
33
- pass
34
- def __init__(self,
55
+
56
+ def __init__(
57
+ self,
35
58
  *,
36
- run_ids: typing.Optional[typing.Iterable[builtins.int]] = ...,
37
- ) -> None: ...
38
- def ClearField(self, field_name: typing_extensions.Literal["run_ids",b"run_ids"]) -> None: ...
59
+ run_ids: collections.abc.Iterable[builtins.int] | None = ...,
60
+ ) -> None: ...
61
+ def ClearField(self, field_name: typing.Literal["run_ids", b"run_ids"]) -> None: ...
62
+
39
63
  global___ListAppsToLaunchResponse = ListAppsToLaunchResponse
40
64
 
65
+ @typing.final
41
66
  class RequestTokenRequest(google.protobuf.message.Message):
42
67
  """RequestToken messages"""
68
+
43
69
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
70
+
44
71
  RUN_ID_FIELD_NUMBER: builtins.int
45
72
  run_id: builtins.int
46
- def __init__(self,
73
+ def __init__(
74
+ self,
47
75
  *,
48
76
  run_id: builtins.int = ...,
49
- ) -> None: ...
50
- def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
77
+ ) -> None: ...
78
+ def ClearField(self, field_name: typing.Literal["run_id", b"run_id"]) -> None: ...
79
+
51
80
  global___RequestTokenRequest = RequestTokenRequest
52
81
 
82
+ @typing.final
53
83
  class RequestTokenResponse(google.protobuf.message.Message):
54
84
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
85
+
55
86
  TOKEN_FIELD_NUMBER: builtins.int
56
- token: typing.Text
57
- def __init__(self,
87
+ token: builtins.str
88
+ def __init__(
89
+ self,
58
90
  *,
59
- token: typing.Text = ...,
60
- ) -> None: ...
61
- def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
91
+ token: builtins.str = ...,
92
+ ) -> None: ...
93
+ def ClearField(self, field_name: typing.Literal["token", b"token"]) -> None: ...
94
+
62
95
  global___RequestTokenResponse = RequestTokenResponse
63
96
 
97
+ @typing.final
64
98
  class PushAppMessagesRequest(google.protobuf.message.Message):
65
99
  """PushAppMessages messages"""
100
+
66
101
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
102
+
67
103
  TOKEN_FIELD_NUMBER: builtins.int
68
104
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
69
105
  RUN_ID_FIELD_NUMBER: builtins.int
70
106
  MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
71
- token: typing.Text
107
+ token: builtins.str
108
+ run_id: builtins.int
72
109
  @property
73
110
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
74
- run_id: builtins.int
75
111
  @property
76
112
  def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
77
- def __init__(self,
113
+ def __init__(
114
+ self,
78
115
  *,
79
- token: typing.Text = ...,
80
- messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
116
+ token: builtins.str = ...,
117
+ messages_list: collections.abc.Iterable[flwr.proto.message_pb2.Message] | None = ...,
81
118
  run_id: builtins.int = ...,
82
- message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
83
- ) -> None: ...
84
- def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list","run_id",b"run_id","token",b"token"]) -> None: ...
119
+ message_object_trees: collections.abc.Iterable[flwr.proto.message_pb2.ObjectTree] | None = ...,
120
+ ) -> None: ...
121
+ def ClearField(self, field_name: typing.Literal["message_object_trees", b"message_object_trees", "messages_list", b"messages_list", "run_id", b"run_id", "token", b"token"]) -> None: ...
122
+
85
123
  global___PushAppMessagesRequest = PushAppMessagesRequest
86
124
 
125
+ @typing.final
87
126
  class PushAppMessagesResponse(google.protobuf.message.Message):
88
127
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
128
+
89
129
  MESSAGE_IDS_FIELD_NUMBER: builtins.int
90
130
  OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
91
131
  @property
92
- def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
132
+ def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
93
133
  @property
94
- def objects_to_push(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
95
- def __init__(self,
134
+ def objects_to_push(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
135
+ def __init__(
136
+ self,
96
137
  *,
97
- message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
98
- objects_to_push: typing.Optional[typing.Iterable[typing.Text]] = ...,
99
- ) -> None: ...
100
- def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","objects_to_push",b"objects_to_push"]) -> None: ...
138
+ message_ids: collections.abc.Iterable[builtins.str] | None = ...,
139
+ objects_to_push: collections.abc.Iterable[builtins.str] | None = ...,
140
+ ) -> None: ...
141
+ def ClearField(self, field_name: typing.Literal["message_ids", b"message_ids", "objects_to_push", b"objects_to_push"]) -> None: ...
142
+
101
143
  global___PushAppMessagesResponse = PushAppMessagesResponse
102
144
 
145
+ @typing.final
103
146
  class PullAppMessagesRequest(google.protobuf.message.Message):
104
147
  """PullAppMessages messages"""
148
+
105
149
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
150
+
106
151
  TOKEN_FIELD_NUMBER: builtins.int
107
152
  MESSAGE_IDS_FIELD_NUMBER: builtins.int
108
153
  RUN_ID_FIELD_NUMBER: builtins.int
109
- token: typing.Text
110
- @property
111
- def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
154
+ token: builtins.str
112
155
  run_id: builtins.int
113
- def __init__(self,
156
+ @property
157
+ def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
158
+ def __init__(
159
+ self,
114
160
  *,
115
- token: typing.Text = ...,
116
- message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
161
+ token: builtins.str = ...,
162
+ message_ids: collections.abc.Iterable[builtins.str] | None = ...,
117
163
  run_id: builtins.int = ...,
118
- ) -> None: ...
119
- def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","run_id",b"run_id","token",b"token"]) -> None: ...
164
+ ) -> None: ...
165
+ def ClearField(self, field_name: typing.Literal["message_ids", b"message_ids", "run_id", b"run_id", "token", b"token"]) -> None: ...
166
+
120
167
  global___PullAppMessagesRequest = PullAppMessagesRequest
121
168
 
169
+ @typing.final
122
170
  class PullAppMessagesResponse(google.protobuf.message.Message):
123
171
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
172
+
124
173
  MESSAGES_LIST_FIELD_NUMBER: builtins.int
125
174
  MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
126
175
  @property
127
176
  def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
128
177
  @property
129
178
  def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
130
- def __init__(self,
179
+ def __init__(
180
+ self,
131
181
  *,
132
- messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
133
- message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
134
- ) -> None: ...
135
- def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list"]) -> None: ...
182
+ messages_list: collections.abc.Iterable[flwr.proto.message_pb2.Message] | None = ...,
183
+ message_object_trees: collections.abc.Iterable[flwr.proto.message_pb2.ObjectTree] | None = ...,
184
+ ) -> None: ...
185
+ def ClearField(self, field_name: typing.Literal["message_object_trees", b"message_object_trees", "messages_list", b"messages_list"]) -> None: ...
186
+
136
187
  global___PullAppMessagesResponse = PullAppMessagesResponse
137
188
 
189
+ @typing.final
138
190
  class PullAppInputsRequest(google.protobuf.message.Message):
139
191
  """PullAppInputs messages"""
192
+
140
193
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
194
+
141
195
  TOKEN_FIELD_NUMBER: builtins.int
142
- token: typing.Text
143
- def __init__(self,
196
+ token: builtins.str
197
+ def __init__(
198
+ self,
144
199
  *,
145
- token: typing.Text = ...,
146
- ) -> None: ...
147
- def ClearField(self, field_name: typing_extensions.Literal["token",b"token"]) -> None: ...
200
+ token: builtins.str = ...,
201
+ ) -> None: ...
202
+ def ClearField(self, field_name: typing.Literal["token", b"token"]) -> None: ...
203
+
148
204
  global___PullAppInputsRequest = PullAppInputsRequest
149
205
 
206
+ @typing.final
150
207
  class PullAppInputsResponse(google.protobuf.message.Message):
151
208
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
209
+
152
210
  CONTEXT_FIELD_NUMBER: builtins.int
153
211
  RUN_FIELD_NUMBER: builtins.int
154
212
  FAB_FIELD_NUMBER: builtins.int
@@ -158,38 +216,49 @@ class PullAppInputsResponse(google.protobuf.message.Message):
158
216
  def run(self) -> flwr.proto.run_pb2.Run: ...
159
217
  @property
160
218
  def fab(self) -> flwr.proto.fab_pb2.Fab: ...
161
- def __init__(self,
219
+ def __init__(
220
+ self,
162
221
  *,
163
- context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
164
- run: typing.Optional[flwr.proto.run_pb2.Run] = ...,
165
- fab: typing.Optional[flwr.proto.fab_pb2.Fab] = ...,
166
- ) -> None: ...
167
- def HasField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> builtins.bool: ...
168
- def ClearField(self, field_name: typing_extensions.Literal["context",b"context","fab",b"fab","run",b"run"]) -> None: ...
222
+ context: flwr.proto.message_pb2.Context | None = ...,
223
+ run: flwr.proto.run_pb2.Run | None = ...,
224
+ fab: flwr.proto.fab_pb2.Fab | None = ...,
225
+ ) -> None: ...
226
+ def HasField(self, field_name: typing.Literal["context", b"context", "fab", b"fab", "run", b"run"]) -> builtins.bool: ...
227
+ def ClearField(self, field_name: typing.Literal["context", b"context", "fab", b"fab", "run", b"run"]) -> None: ...
228
+
169
229
  global___PullAppInputsResponse = PullAppInputsResponse
170
230
 
231
+ @typing.final
171
232
  class PushAppOutputsRequest(google.protobuf.message.Message):
172
233
  """PushAppInputs messages"""
234
+
173
235
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
236
+
174
237
  TOKEN_FIELD_NUMBER: builtins.int
175
238
  RUN_ID_FIELD_NUMBER: builtins.int
176
239
  CONTEXT_FIELD_NUMBER: builtins.int
177
- token: typing.Text
240
+ token: builtins.str
178
241
  run_id: builtins.int
179
242
  @property
180
243
  def context(self) -> flwr.proto.message_pb2.Context: ...
181
- def __init__(self,
244
+ def __init__(
245
+ self,
182
246
  *,
183
- token: typing.Text = ...,
247
+ token: builtins.str = ...,
184
248
  run_id: builtins.int = ...,
185
- context: typing.Optional[flwr.proto.message_pb2.Context] = ...,
186
- ) -> None: ...
187
- def HasField(self, field_name: typing_extensions.Literal["context",b"context"]) -> builtins.bool: ...
188
- def ClearField(self, field_name: typing_extensions.Literal["context",b"context","run_id",b"run_id","token",b"token"]) -> None: ...
249
+ context: flwr.proto.message_pb2.Context | None = ...,
250
+ ) -> None: ...
251
+ def HasField(self, field_name: typing.Literal["context", b"context"]) -> builtins.bool: ...
252
+ def ClearField(self, field_name: typing.Literal["context", b"context", "run_id", b"run_id", "token", b"token"]) -> None: ...
253
+
189
254
  global___PushAppOutputsRequest = PushAppOutputsRequest
190
255
 
256
+ @typing.final
191
257
  class PushAppOutputsResponse(google.protobuf.message.Message):
192
258
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
193
- def __init__(self,
194
- ) -> None: ...
259
+
260
+ def __init__(
261
+ self,
262
+ ) -> None: ...
263
+
195
264
  global___PushAppOutputsResponse = PushAppOutputsResponse
@@ -1,4 +1,24 @@
1
1
  # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
+ import warnings
4
5
 
6
+
7
+ GRPC_GENERATED_VERSION = '1.70.0'
8
+ GRPC_VERSION = grpc.__version__
9
+ _version_not_supported = False
10
+
11
+ try:
12
+ from grpc._utilities import first_version_is_lower
13
+ _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
14
+ except ImportError:
15
+ _version_not_supported = True
16
+
17
+ if _version_not_supported:
18
+ raise RuntimeError(
19
+ f'The grpc package installed is at version {GRPC_VERSION},'
20
+ + f' but the generated code in flwr/proto/appio_pb2_grpc.py depends on'
21
+ + f' grpcio>={GRPC_GENERATED_VERSION}.'
22
+ + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
23
+ + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
24
+ )
@@ -1,4 +1,31 @@
1
1
  """
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
+ Copyright 2025 Flower Labs GmbH. All Rights Reserved.
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License");
7
+ you may not use this file except in compliance with the License.
8
+ You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ Unless required by applicable law or agreed to in writing, software
13
+ distributed under the License is distributed on an "AS IS" BASIS,
14
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ See the License for the specific language governing permissions and
16
+ limitations under the License.
17
+ ==============================================================================
4
18
  """
19
+
20
+ import abc
21
+ import collections.abc
22
+ import grpc
23
+ import grpc.aio
24
+ import typing
25
+
26
+ _T = typing.TypeVar("_T")
27
+
28
+ class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ...
29
+
30
+ class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext): # type: ignore[misc, type-arg]
31
+ ...