flwr-nightly 1.23.0.dev20250930__py3-none-any.whl → 1.26.0.dev20260121__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 (375) hide show
  1. flwr/__init__.py +17 -6
  2. flwr/app/__init__.py +4 -1
  3. flwr/app/error.py +2 -2
  4. flwr/app/exception.py +3 -3
  5. flwr/app/message_type.py +29 -0
  6. flwr/app/metadata.py +5 -2
  7. flwr/app/user_config.py +19 -0
  8. flwr/cli/app.py +62 -9
  9. flwr/cli/{new/templates/app/code → app_cmd}/__init__.py +9 -1
  10. flwr/cli/app_cmd/publish.py +285 -0
  11. flwr/cli/app_cmd/review.py +262 -0
  12. flwr/cli/auth_plugin/__init__.py +13 -6
  13. flwr/cli/auth_plugin/auth_plugin.py +26 -15
  14. flwr/cli/auth_plugin/noop_auth_plugin.py +101 -0
  15. flwr/cli/auth_plugin/oidc_cli_plugin.py +52 -32
  16. flwr/cli/build.py +166 -53
  17. flwr/cli/{cli_user_auth_interceptor.py → cli_account_auth_interceptor.py} +27 -10
  18. flwr/cli/config/__init__.py +21 -0
  19. flwr/cli/config/ls.py +104 -0
  20. flwr/cli/config_migration.py +300 -0
  21. flwr/cli/config_utils.py +154 -13
  22. flwr/cli/constant.py +67 -0
  23. flwr/cli/{new/templates/app/code/flwr_tune → federation}/__init__.py +8 -1
  24. flwr/cli/federation/ls.py +361 -0
  25. flwr/cli/flower_config.py +447 -0
  26. flwr/cli/install.py +91 -13
  27. flwr/cli/log.py +65 -36
  28. flwr/cli/login/login.py +41 -27
  29. flwr/cli/ls.py +232 -158
  30. flwr/cli/new/new.py +188 -244
  31. flwr/cli/pull.py +25 -34
  32. flwr/cli/run/run.py +106 -74
  33. flwr/cli/run_utils.py +148 -0
  34. flwr/cli/stop.py +46 -37
  35. flwr/cli/supernode/__init__.py +25 -0
  36. flwr/cli/supernode/ls.py +273 -0
  37. flwr/cli/supernode/register.py +190 -0
  38. flwr/cli/supernode/unregister.py +140 -0
  39. flwr/cli/typing.py +211 -0
  40. flwr/cli/utils.py +428 -80
  41. flwr/client/__init__.py +2 -1
  42. flwr/client/dpfedavg_numpy_client.py +4 -1
  43. flwr/client/grpc_adapter_client/connection.py +14 -17
  44. flwr/client/grpc_rere_client/connection.py +73 -43
  45. flwr/client/grpc_rere_client/grpc_adapter.py +35 -15
  46. flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +5 -7
  47. flwr/client/message_handler/message_handler.py +4 -3
  48. flwr/client/mod/centraldp_mods.py +1 -1
  49. flwr/client/mod/localdp_mod.py +1 -1
  50. flwr/client/mod/secure_aggregation/secaggplus_mod.py +11 -9
  51. flwr/client/numpy_client.py +1 -1
  52. flwr/client/rest_client/connection.py +99 -54
  53. flwr/client/run_info_store.py +6 -6
  54. flwr/client/typing.py +1 -1
  55. flwr/clientapp/__init__.py +1 -2
  56. flwr/{client → clientapp}/client_app.py +11 -11
  57. flwr/clientapp/mod/centraldp_mods.py +16 -17
  58. flwr/clientapp/mod/localdp_mod.py +8 -9
  59. flwr/clientapp/typing.py +1 -1
  60. flwr/{client/clientapp → clientapp}/utils.py +4 -4
  61. flwr/common/__init__.py +3 -2
  62. flwr/common/args.py +3 -4
  63. flwr/common/config.py +15 -17
  64. flwr/common/constant.py +56 -28
  65. flwr/common/context.py +2 -1
  66. flwr/common/differential_privacy.py +3 -4
  67. flwr/common/event_log_plugin/event_log_plugin.py +3 -4
  68. flwr/common/exit/exit.py +16 -3
  69. flwr/common/exit/exit_code.py +39 -10
  70. flwr/common/exit/exit_handler.py +6 -2
  71. flwr/common/exit/signal_handler.py +5 -5
  72. flwr/common/grpc.py +8 -7
  73. flwr/common/inflatable_protobuf_utils.py +1 -1
  74. flwr/common/inflatable_utils.py +48 -31
  75. flwr/common/logger.py +19 -19
  76. flwr/common/message.py +5 -5
  77. flwr/common/object_ref.py +7 -7
  78. flwr/common/record/array.py +6 -6
  79. flwr/common/record/arrayrecord.py +18 -21
  80. flwr/common/record/configrecord.py +3 -3
  81. flwr/common/record/recorddict.py +5 -5
  82. flwr/common/record/typeddict.py +9 -2
  83. flwr/common/recorddict_compat.py +7 -10
  84. flwr/common/retry_invoker.py +20 -20
  85. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
  86. flwr/common/secure_aggregation/ndarrays_arithmetic.py +8 -5
  87. flwr/common/serde.py +22 -11
  88. flwr/common/serde_utils.py +2 -2
  89. flwr/common/telemetry.py +10 -6
  90. flwr/common/typing.py +65 -44
  91. flwr/compat/client/app.py +45 -47
  92. flwr/compat/client/grpc_client/connection.py +15 -14
  93. flwr/compat/common/constant.py +29 -0
  94. flwr/compat/server/app.py +6 -7
  95. flwr/proto/appio_pb2.py +13 -3
  96. flwr/proto/appio_pb2.pyi +134 -65
  97. flwr/proto/appio_pb2_grpc.py +20 -0
  98. flwr/proto/appio_pb2_grpc.pyi +27 -0
  99. flwr/proto/clientappio_pb2.py +17 -7
  100. flwr/proto/clientappio_pb2.pyi +15 -0
  101. flwr/proto/clientappio_pb2_grpc.py +206 -40
  102. flwr/proto/clientappio_pb2_grpc.pyi +168 -53
  103. flwr/proto/control_pb2.py +72 -40
  104. flwr/proto/control_pb2.pyi +319 -87
  105. flwr/proto/control_pb2_grpc.py +339 -28
  106. flwr/proto/control_pb2_grpc.pyi +209 -37
  107. flwr/proto/error_pb2.py +13 -3
  108. flwr/proto/error_pb2.pyi +24 -6
  109. flwr/proto/error_pb2_grpc.py +20 -0
  110. flwr/proto/error_pb2_grpc.pyi +27 -0
  111. flwr/proto/fab_pb2.py +24 -10
  112. flwr/proto/fab_pb2.pyi +68 -20
  113. flwr/proto/fab_pb2_grpc.py +20 -0
  114. flwr/proto/fab_pb2_grpc.pyi +27 -0
  115. flwr/proto/federation_pb2.py +38 -0
  116. flwr/proto/federation_pb2.pyi +56 -0
  117. flwr/proto/federation_pb2_grpc.py +24 -0
  118. flwr/proto/federation_pb2_grpc.pyi +31 -0
  119. flwr/proto/fleet_pb2.py +45 -27
  120. flwr/proto/fleet_pb2.pyi +190 -70
  121. flwr/proto/fleet_pb2_grpc.py +277 -66
  122. flwr/proto/fleet_pb2_grpc.pyi +201 -55
  123. flwr/proto/grpcadapter_pb2.py +14 -4
  124. flwr/proto/grpcadapter_pb2.pyi +38 -16
  125. flwr/proto/grpcadapter_pb2_grpc.py +35 -4
  126. flwr/proto/grpcadapter_pb2_grpc.pyi +38 -7
  127. flwr/proto/heartbeat_pb2.py +17 -7
  128. flwr/proto/heartbeat_pb2.pyi +51 -22
  129. flwr/proto/heartbeat_pb2_grpc.py +20 -0
  130. flwr/proto/heartbeat_pb2_grpc.pyi +27 -0
  131. flwr/proto/log_pb2.py +13 -3
  132. flwr/proto/log_pb2.pyi +34 -11
  133. flwr/proto/log_pb2_grpc.py +20 -0
  134. flwr/proto/log_pb2_grpc.pyi +27 -0
  135. flwr/proto/message_pb2.py +15 -5
  136. flwr/proto/message_pb2.pyi +154 -86
  137. flwr/proto/message_pb2_grpc.py +20 -0
  138. flwr/proto/message_pb2_grpc.pyi +27 -0
  139. flwr/proto/node_pb2.py +16 -4
  140. flwr/proto/node_pb2.pyi +77 -4
  141. flwr/proto/node_pb2_grpc.py +20 -0
  142. flwr/proto/node_pb2_grpc.pyi +27 -0
  143. flwr/proto/recorddict_pb2.py +13 -3
  144. flwr/proto/recorddict_pb2.pyi +184 -107
  145. flwr/proto/recorddict_pb2_grpc.py +20 -0
  146. flwr/proto/recorddict_pb2_grpc.pyi +27 -0
  147. flwr/proto/run_pb2.py +40 -31
  148. flwr/proto/run_pb2.pyi +158 -84
  149. flwr/proto/run_pb2_grpc.py +20 -0
  150. flwr/proto/run_pb2_grpc.pyi +27 -0
  151. flwr/proto/serverappio_pb2.py +13 -3
  152. flwr/proto/serverappio_pb2.pyi +32 -8
  153. flwr/proto/serverappio_pb2_grpc.py +246 -65
  154. flwr/proto/serverappio_pb2_grpc.pyi +221 -85
  155. flwr/proto/simulationio_pb2.py +16 -8
  156. flwr/proto/simulationio_pb2.pyi +15 -0
  157. flwr/proto/simulationio_pb2_grpc.py +162 -41
  158. flwr/proto/simulationio_pb2_grpc.pyi +149 -55
  159. flwr/proto/transport_pb2.py +20 -10
  160. flwr/proto/transport_pb2.pyi +249 -160
  161. flwr/proto/transport_pb2_grpc.py +35 -4
  162. flwr/proto/transport_pb2_grpc.pyi +38 -8
  163. flwr/server/app.py +175 -128
  164. flwr/server/client_manager.py +4 -5
  165. flwr/server/client_proxy.py +10 -11
  166. flwr/server/compat/app.py +4 -5
  167. flwr/server/compat/app_utils.py +2 -1
  168. flwr/server/compat/grid_client_proxy.py +12 -13
  169. flwr/server/compat/legacy_context.py +3 -4
  170. flwr/server/fleet_event_log_interceptor.py +2 -1
  171. flwr/server/grid/grid.py +2 -3
  172. flwr/server/grid/grpc_grid.py +12 -10
  173. flwr/server/grid/inmemory_grid.py +4 -4
  174. flwr/server/run_serverapp.py +2 -3
  175. flwr/server/server.py +34 -39
  176. flwr/server/server_app.py +7 -8
  177. flwr/server/server_config.py +1 -2
  178. flwr/server/serverapp/app.py +34 -28
  179. flwr/server/serverapp_components.py +4 -5
  180. flwr/server/strategy/aggregate.py +9 -8
  181. flwr/server/strategy/bulyan.py +13 -11
  182. flwr/server/strategy/dp_adaptive_clipping.py +16 -20
  183. flwr/server/strategy/dp_fixed_clipping.py +12 -17
  184. flwr/server/strategy/dpfedavg_adaptive.py +3 -4
  185. flwr/server/strategy/dpfedavg_fixed.py +6 -10
  186. flwr/server/strategy/fault_tolerant_fedavg.py +14 -13
  187. flwr/server/strategy/fedadagrad.py +18 -14
  188. flwr/server/strategy/fedadam.py +16 -14
  189. flwr/server/strategy/fedavg.py +16 -17
  190. flwr/server/strategy/fedavg_android.py +15 -15
  191. flwr/server/strategy/fedavgm.py +21 -18
  192. flwr/server/strategy/fedmedian.py +2 -3
  193. flwr/server/strategy/fedopt.py +11 -10
  194. flwr/server/strategy/fedprox.py +10 -9
  195. flwr/server/strategy/fedtrimmedavg.py +12 -11
  196. flwr/server/strategy/fedxgb_bagging.py +13 -11
  197. flwr/server/strategy/fedxgb_cyclic.py +6 -6
  198. flwr/server/strategy/fedxgb_nn_avg.py +4 -4
  199. flwr/server/strategy/fedyogi.py +16 -14
  200. flwr/server/strategy/krum.py +12 -11
  201. flwr/server/strategy/qfedavg.py +16 -15
  202. flwr/server/strategy/strategy.py +6 -9
  203. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +20 -9
  204. flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -2
  205. flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +3 -4
  206. flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +10 -12
  207. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +1 -3
  208. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +136 -42
  209. flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +28 -50
  210. flwr/server/superlink/fleet/message_handler/message_handler.py +141 -51
  211. flwr/server/superlink/fleet/rest_rere/rest_api.py +54 -33
  212. flwr/server/superlink/fleet/vce/backend/backend.py +2 -2
  213. flwr/server/superlink/fleet/vce/backend/raybackend.py +6 -6
  214. flwr/server/superlink/fleet/vce/vce_api.py +32 -13
  215. flwr/server/superlink/linkstate/__init__.py +2 -0
  216. flwr/server/superlink/linkstate/in_memory_linkstate.py +293 -208
  217. flwr/server/superlink/linkstate/linkstate.py +176 -64
  218. flwr/server/superlink/linkstate/linkstate_factory.py +24 -6
  219. flwr/server/superlink/linkstate/sql_linkstate.py +221 -0
  220. flwr/server/superlink/linkstate/sqlite_linkstate.py +743 -648
  221. flwr/server/superlink/linkstate/utils.py +11 -62
  222. flwr/server/superlink/serverappio/serverappio_grpc.py +1 -2
  223. flwr/server/superlink/serverappio/serverappio_servicer.py +28 -23
  224. flwr/server/superlink/simulation/simulationio_grpc.py +1 -2
  225. flwr/server/superlink/simulation/simulationio_servicer.py +19 -14
  226. flwr/server/superlink/utils.py +4 -6
  227. flwr/server/typing.py +1 -1
  228. flwr/server/utils/tensorboard.py +15 -8
  229. flwr/server/utils/validator.py +2 -3
  230. flwr/server/workflow/default_workflows.py +7 -6
  231. flwr/server/workflow/secure_aggregation/secagg_workflow.py +2 -4
  232. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +13 -11
  233. flwr/serverapp/strategy/bulyan.py +16 -15
  234. flwr/serverapp/strategy/dp_adaptive_clipping.py +12 -11
  235. flwr/serverapp/strategy/dp_fixed_clipping.py +11 -14
  236. flwr/serverapp/strategy/fedadagrad.py +10 -11
  237. flwr/serverapp/strategy/fedadam.py +10 -11
  238. flwr/serverapp/strategy/fedavg.py +10 -11
  239. flwr/serverapp/strategy/fedavgm.py +17 -16
  240. flwr/serverapp/strategy/fedmedian.py +2 -2
  241. flwr/serverapp/strategy/fedopt.py +10 -11
  242. flwr/serverapp/strategy/fedprox.py +7 -8
  243. flwr/serverapp/strategy/fedtrimmedavg.py +9 -9
  244. flwr/serverapp/strategy/fedxgb_bagging.py +3 -3
  245. flwr/serverapp/strategy/fedxgb_cyclic.py +10 -10
  246. flwr/serverapp/strategy/fedyogi.py +9 -11
  247. flwr/serverapp/strategy/krum.py +7 -7
  248. flwr/serverapp/strategy/multikrum.py +9 -9
  249. flwr/serverapp/strategy/qfedavg.py +17 -16
  250. flwr/serverapp/strategy/strategy.py +6 -9
  251. flwr/serverapp/strategy/strategy_utils.py +7 -8
  252. flwr/simulation/app.py +46 -42
  253. flwr/simulation/legacy_app.py +12 -12
  254. flwr/simulation/ray_transport/ray_actor.py +11 -12
  255. flwr/simulation/ray_transport/ray_client_proxy.py +14 -19
  256. flwr/simulation/run_simulation.py +46 -44
  257. flwr/simulation/simulationio_connection.py +4 -4
  258. flwr/{common → supercore}/address.py +1 -37
  259. flwr/supercore/cli/flower_superexec.py +3 -4
  260. flwr/supercore/constant.py +69 -0
  261. flwr/supercore/corestate/corestate.py +24 -3
  262. flwr/supercore/corestate/in_memory_corestate.py +138 -0
  263. flwr/supercore/corestate/sql_corestate.py +153 -0
  264. flwr/supercore/corestate/sqlite_corestate.py +157 -0
  265. flwr/supercore/credential_store/__init__.py +33 -0
  266. flwr/supercore/credential_store/credential_store.py +34 -0
  267. flwr/supercore/credential_store/file_credential_store.py +76 -0
  268. flwr/{common → supercore}/date.py +0 -11
  269. flwr/supercore/ffs/disk_ffs.py +1 -2
  270. flwr/supercore/ffs/ffs.py +1 -2
  271. flwr/supercore/ffs/ffs_factory.py +1 -2
  272. flwr/{common → supercore}/heartbeat.py +20 -25
  273. flwr/supercore/object_store/in_memory_object_store.py +1 -6
  274. flwr/supercore/object_store/object_store.py +1 -2
  275. flwr/supercore/object_store/object_store_factory.py +27 -8
  276. flwr/supercore/object_store/sqlite_object_store.py +253 -0
  277. flwr/{cli/new/templates/app → supercore/primitives}/__init__.py +1 -1
  278. flwr/supercore/primitives/asymmetric.py +117 -0
  279. flwr/supercore/primitives/asymmetric_ed25519.py +175 -0
  280. flwr/supercore/sql_mixin.py +292 -0
  281. flwr/supercore/sqlite_mixin.py +156 -0
  282. flwr/{client/clientapp → supercore/state}/__init__.py +2 -2
  283. flwr/supercore/state/schema/README.md +125 -0
  284. flwr/{cli/new/templates → supercore/state/schema}/__init__.py +2 -2
  285. flwr/supercore/state/schema/corestate_tables.py +36 -0
  286. flwr/supercore/state/schema/linkstate_tables.py +152 -0
  287. flwr/supercore/state/schema/objectstore_tables.py +90 -0
  288. flwr/supercore/superexec/plugin/base_exec_plugin.py +1 -2
  289. flwr/supercore/superexec/plugin/exec_plugin.py +3 -3
  290. flwr/supercore/superexec/run_superexec.py +9 -13
  291. flwr/supercore/utils.py +224 -0
  292. flwr/superlink/artifact_provider/artifact_provider.py +1 -2
  293. flwr/superlink/auth_plugin/__init__.py +5 -2
  294. flwr/superlink/auth_plugin/auth_plugin.py +20 -19
  295. flwr/superlink/auth_plugin/noop_auth_plugin.py +84 -0
  296. flwr/superlink/federation/__init__.py +24 -0
  297. flwr/superlink/federation/federation_manager.py +64 -0
  298. flwr/superlink/federation/noop_federation_manager.py +71 -0
  299. flwr/superlink/servicer/control/{control_user_auth_interceptor.py → control_account_auth_interceptor.py} +41 -32
  300. flwr/superlink/servicer/control/control_event_log_interceptor.py +7 -7
  301. flwr/superlink/servicer/control/control_grpc.py +20 -17
  302. flwr/superlink/servicer/control/control_license_interceptor.py +3 -3
  303. flwr/superlink/servicer/control/control_servicer.py +328 -68
  304. flwr/supernode/cli/flower_supernode.py +74 -26
  305. flwr/supernode/nodestate/in_memory_nodestate.py +121 -49
  306. flwr/supernode/nodestate/nodestate.py +52 -8
  307. flwr/supernode/nodestate/nodestate_factory.py +7 -4
  308. flwr/supernode/runtime/run_clientapp.py +43 -24
  309. flwr/supernode/servicer/clientappio/clientappio_servicer.py +48 -10
  310. flwr/supernode/start_client_internal.py +185 -57
  311. {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/METADATA +10 -11
  312. flwr_nightly-1.26.0.dev20260121.dist-info/RECORD +411 -0
  313. flwr/cli/new/templates/app/.gitignore.tpl +0 -163
  314. flwr/cli/new/templates/app/LICENSE.tpl +0 -202
  315. flwr/cli/new/templates/app/README.baseline.md.tpl +0 -127
  316. flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -68
  317. flwr/cli/new/templates/app/README.md.tpl +0 -37
  318. flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -1
  319. flwr/cli/new/templates/app/code/__init__.py.tpl +0 -1
  320. flwr/cli/new/templates/app/code/__init__.pytorch_legacy_api.py.tpl +0 -1
  321. flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -75
  322. flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -93
  323. flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -71
  324. flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -102
  325. flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -46
  326. flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -80
  327. flwr/cli/new/templates/app/code/client.pytorch_legacy_api.py.tpl +0 -55
  328. flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -108
  329. flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -82
  330. flwr/cli/new/templates/app/code/client.xgboost.py.tpl +0 -110
  331. flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -36
  332. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -92
  333. flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -87
  334. flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -56
  335. flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -73
  336. flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -78
  337. flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -66
  338. flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -43
  339. flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -42
  340. flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -39
  341. flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -41
  342. flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -38
  343. flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -41
  344. flwr/cli/new/templates/app/code/server.pytorch_legacy_api.py.tpl +0 -31
  345. flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -44
  346. flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -38
  347. flwr/cli/new/templates/app/code/server.xgboost.py.tpl +0 -56
  348. flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -1
  349. flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -98
  350. flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -57
  351. flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -102
  352. flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -7
  353. flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -98
  354. flwr/cli/new/templates/app/code/task.pytorch_legacy_api.py.tpl +0 -111
  355. flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -67
  356. flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -52
  357. flwr/cli/new/templates/app/code/task.xgboost.py.tpl +0 -67
  358. flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -1
  359. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -146
  360. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -80
  361. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -65
  362. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -52
  363. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -56
  364. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -49
  365. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -53
  366. flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +0 -53
  367. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -52
  368. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -53
  369. flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +0 -61
  370. flwr/common/pyproject.py +0 -42
  371. flwr/supercore/object_store/utils.py +0 -43
  372. flwr_nightly-1.23.0.dev20250930.dist-info/RECORD +0 -429
  373. /flwr/{common → supercore}/version.py +0 -0
  374. {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/WHEEL +0 -0
  375. {flwr_nightly-1.23.0.dev20250930.dist-info → flwr_nightly-1.26.0.dev20260121.dist-info}/entry_points.txt +0 -0
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  from logging import WARNING
19
- from typing import Any, Optional, Union, cast
19
+ from typing import Any, cast
20
20
 
21
21
  from flwr.common import EvaluateIns, EvaluateRes, FitIns, FitRes, Parameters, Scalar
22
22
  from flwr.common.logger import log
@@ -34,7 +34,7 @@ class FedXgbCyclic(FedAvg):
34
34
  self,
35
35
  **kwargs: Any,
36
36
  ):
37
- self.global_model: Optional[bytes] = None
37
+ self.global_model: bytes | None = None
38
38
  super().__init__(**kwargs)
39
39
 
40
40
  def __repr__(self) -> str:
@@ -46,8 +46,8 @@ class FedXgbCyclic(FedAvg):
46
46
  self,
47
47
  server_round: int,
48
48
  results: list[tuple[ClientProxy, FitRes]],
49
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
50
- ) -> tuple[Optional[Parameters], dict[str, Scalar]]:
49
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
50
+ ) -> tuple[Parameters | None, dict[str, Scalar]]:
51
51
  """Aggregate fit results using bagging."""
52
52
  if not results:
53
53
  return None, {}
@@ -70,8 +70,8 @@ class FedXgbCyclic(FedAvg):
70
70
  self,
71
71
  server_round: int,
72
72
  results: list[tuple[ClientProxy, EvaluateRes]],
73
- failures: list[Union[tuple[ClientProxy, EvaluateRes], BaseException]],
74
- ) -> tuple[Optional[float], dict[str, Scalar]]:
73
+ failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
74
+ ) -> tuple[float | None, dict[str, Scalar]]:
75
75
  """Aggregate evaluation metrics using average."""
76
76
  if not results:
77
77
  return None, {}
@@ -22,7 +22,7 @@ Paper: arxiv.org/abs/2304.07537
22
22
 
23
23
 
24
24
  from logging import WARNING
25
- from typing import Any, Optional, Union
25
+ from typing import Any
26
26
 
27
27
  from flwr.common import FitRes, Scalar, ndarrays_to_parameters, parameters_to_ndarrays
28
28
  from flwr.common.logger import log, warn_deprecated_feature
@@ -57,7 +57,7 @@ class FedXgbNnAvg(FedAvg):
57
57
 
58
58
  def evaluate(
59
59
  self, server_round: int, parameters: Any
60
- ) -> Optional[tuple[float, dict[str, Scalar]]]:
60
+ ) -> tuple[float, dict[str, Scalar]] | None:
61
61
  """Evaluate model parameters using an evaluation function."""
62
62
  if self.evaluate_fn is None:
63
63
  # No evaluation function provided
@@ -72,8 +72,8 @@ class FedXgbNnAvg(FedAvg):
72
72
  self,
73
73
  server_round: int,
74
74
  results: list[tuple[ClientProxy, FitRes]],
75
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
76
- ) -> tuple[Optional[Any], dict[str, Scalar]]:
75
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
76
+ ) -> tuple[Any | None, dict[str, Scalar]]:
77
77
  """Aggregate fit results using weighted average."""
78
78
  if not results:
79
79
  return None, {}
@@ -18,7 +18,7 @@ Paper: arxiv.org/abs/2003.00295
18
18
  """
19
19
 
20
20
 
21
- from typing import Callable, Optional, Union
21
+ from collections.abc import Callable
22
22
 
23
23
  import numpy as np
24
24
 
@@ -91,18 +91,19 @@ class FedYogi(FedOpt):
91
91
  min_fit_clients: int = 2,
92
92
  min_evaluate_clients: int = 2,
93
93
  min_available_clients: int = 2,
94
- evaluate_fn: Optional[
94
+ evaluate_fn: (
95
95
  Callable[
96
96
  [int, NDArrays, dict[str, Scalar]],
97
- Optional[tuple[float, dict[str, Scalar]]],
97
+ tuple[float, dict[str, Scalar]] | None,
98
98
  ]
99
- ] = None,
100
- on_fit_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
101
- on_evaluate_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
99
+ | None
100
+ ) = None,
101
+ on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
102
+ on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
102
103
  accept_failures: bool = True,
103
104
  initial_parameters: Parameters,
104
- fit_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
105
- evaluate_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
105
+ fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
106
+ evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
106
107
  eta: float = 1e-2,
107
108
  eta_l: float = 0.0316,
108
109
  beta_1: float = 0.9,
@@ -138,8 +139,8 @@ class FedYogi(FedOpt):
138
139
  self,
139
140
  server_round: int,
140
141
  results: list[tuple[ClientProxy, FitRes]],
141
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
142
- ) -> tuple[Optional[Parameters], dict[str, Scalar]]:
142
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
143
+ ) -> tuple[Parameters | None, dict[str, Scalar]]:
143
144
  """Aggregate fit results using weighted average."""
144
145
  fedavg_parameters_aggregated, metrics_aggregated = super().aggregate_fit(
145
146
  server_round=server_round, results=results, failures=failures
@@ -151,7 +152,8 @@ class FedYogi(FedOpt):
151
152
 
152
153
  # Yogi
153
154
  delta_t: NDArrays = [
154
- x - y for x, y in zip(fedavg_weights_aggregate, self.current_weights)
155
+ x - y
156
+ for x, y in zip(fedavg_weights_aggregate, self.current_weights, strict=True)
155
157
  ]
156
158
 
157
159
  # m_t
@@ -159,7 +161,7 @@ class FedYogi(FedOpt):
159
161
  self.m_t = [np.zeros_like(x) for x in delta_t]
160
162
  self.m_t = [
161
163
  np.multiply(self.beta_1, x) + (1 - self.beta_1) * y
162
- for x, y in zip(self.m_t, delta_t)
164
+ for x, y in zip(self.m_t, delta_t, strict=True)
163
165
  ]
164
166
 
165
167
  # v_t
@@ -167,12 +169,12 @@ class FedYogi(FedOpt):
167
169
  self.v_t = [np.zeros_like(x) for x in delta_t]
168
170
  self.v_t = [
169
171
  x - (1.0 - self.beta_2) * np.multiply(y, y) * np.sign(x - np.multiply(y, y))
170
- for x, y in zip(self.v_t, delta_t)
172
+ for x, y in zip(self.v_t, delta_t, strict=True)
171
173
  ]
172
174
 
173
175
  new_weights = [
174
176
  x + self.eta * y / (np.sqrt(z) + self.tau)
175
- for x, y, z in zip(self.current_weights, self.m_t, self.v_t)
177
+ for x, y, z in zip(self.current_weights, self.m_t, self.v_t, strict=True)
176
178
  ]
177
179
 
178
180
  self.current_weights = new_weights
@@ -20,8 +20,8 @@ Paper: proceedings.neurips.cc/paper/2017/file/f4b9ec30ad9f68f89b29639786cb62ef-P
20
20
  """
21
21
 
22
22
 
23
+ from collections.abc import Callable
23
24
  from logging import WARNING
24
- from typing import Callable, Optional, Union
25
25
 
26
26
  from flwr.common import (
27
27
  FitRes,
@@ -85,18 +85,19 @@ class Krum(FedAvg):
85
85
  min_available_clients: int = 2,
86
86
  num_malicious_clients: int = 0,
87
87
  num_clients_to_keep: int = 0,
88
- evaluate_fn: Optional[
88
+ evaluate_fn: (
89
89
  Callable[
90
90
  [int, NDArrays, dict[str, Scalar]],
91
- Optional[tuple[float, dict[str, Scalar]]],
91
+ tuple[float, dict[str, Scalar]] | None,
92
92
  ]
93
- ] = None,
94
- on_fit_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
95
- on_evaluate_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
93
+ | None
94
+ ) = None,
95
+ on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
96
+ on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
96
97
  accept_failures: bool = True,
97
- initial_parameters: Optional[Parameters] = None,
98
- fit_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
99
- evaluate_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
98
+ initial_parameters: Parameters | None = None,
99
+ fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
100
+ evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
100
101
  ) -> None:
101
102
  super().__init__(
102
103
  fraction_fit=fraction_fit,
@@ -124,8 +125,8 @@ class Krum(FedAvg):
124
125
  self,
125
126
  server_round: int,
126
127
  results: list[tuple[ClientProxy, FitRes]],
127
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
128
- ) -> tuple[Optional[Parameters], dict[str, Scalar]]:
128
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
129
+ ) -> tuple[Parameters | None, dict[str, Scalar]]:
129
130
  """Aggregate fit results using Krum."""
130
131
  if not results:
131
132
  return None, {}
@@ -18,8 +18,8 @@ Paper: openreview.net/pdf?id=ByexElSYDr
18
18
  """
19
19
 
20
20
 
21
+ from collections.abc import Callable
21
22
  from logging import WARNING
22
- from typing import Callable, Optional, Union
23
23
 
24
24
  import numpy as np
25
25
 
@@ -58,18 +58,19 @@ class QFedAvg(FedAvg):
58
58
  min_fit_clients: int = 1,
59
59
  min_evaluate_clients: int = 1,
60
60
  min_available_clients: int = 1,
61
- evaluate_fn: Optional[
61
+ evaluate_fn: (
62
62
  Callable[
63
63
  [int, NDArrays, dict[str, Scalar]],
64
- Optional[tuple[float, dict[str, Scalar]]],
64
+ tuple[float, dict[str, Scalar]] | None,
65
65
  ]
66
- ] = None,
67
- on_fit_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
68
- on_evaluate_config_fn: Optional[Callable[[int], dict[str, Scalar]]] = None,
66
+ | None
67
+ ) = None,
68
+ on_fit_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
69
+ on_evaluate_config_fn: Callable[[int], dict[str, Scalar]] | None = None,
69
70
  accept_failures: bool = True,
70
- initial_parameters: Optional[Parameters] = None,
71
- fit_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
72
- evaluate_metrics_aggregation_fn: Optional[MetricsAggregationFn] = None,
71
+ initial_parameters: Parameters | None = None,
72
+ fit_metrics_aggregation_fn: MetricsAggregationFn | None = None,
73
+ evaluate_metrics_aggregation_fn: MetricsAggregationFn | None = None,
73
74
  ) -> None:
74
75
  super().__init__(
75
76
  fraction_fit=fraction_fit,
@@ -87,7 +88,7 @@ class QFedAvg(FedAvg):
87
88
  )
88
89
  self.learning_rate = qffl_learning_rate
89
90
  self.q_param = q_param
90
- self.pre_weights: Optional[NDArrays] = None
91
+ self.pre_weights: NDArrays | None = None
91
92
 
92
93
  def __repr__(self) -> str:
93
94
  """Compute a string representation of the strategy."""
@@ -159,8 +160,8 @@ class QFedAvg(FedAvg):
159
160
  self,
160
161
  server_round: int,
161
162
  results: list[tuple[ClientProxy, FitRes]],
162
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
163
- ) -> tuple[Optional[Parameters], dict[str, Scalar]]:
163
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
164
+ ) -> tuple[Parameters | None, dict[str, Scalar]]:
164
165
  """Aggregate fit results using weighted average."""
165
166
  if not results:
166
167
  return None, {}
@@ -199,7 +200,7 @@ class QFedAvg(FedAvg):
199
200
  # plug in the weight updates into the gradient
200
201
  grads = [
201
202
  np.multiply((u - v), 1.0 / self.learning_rate)
202
- for u, v in zip(weights_before, new_weights)
203
+ for u, v in zip(weights_before, new_weights, strict=True)
203
204
  ]
204
205
  deltas.append(
205
206
  [np.float_power(loss + 1e-10, self.q_param) * grad for grad in grads]
@@ -230,8 +231,8 @@ class QFedAvg(FedAvg):
230
231
  self,
231
232
  server_round: int,
232
233
  results: list[tuple[ClientProxy, EvaluateRes]],
233
- failures: list[Union[tuple[ClientProxy, EvaluateRes], BaseException]],
234
- ) -> tuple[Optional[float], dict[str, Scalar]]:
234
+ failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
235
+ ) -> tuple[float | None, dict[str, Scalar]]:
235
236
  """Aggregate evaluation losses using weighted average."""
236
237
  if not results:
237
238
  return None, {}
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  from abc import ABC, abstractmethod
19
- from typing import Optional, Union
20
19
 
21
20
  from flwr.common import EvaluateIns, EvaluateRes, FitIns, FitRes, Parameters, Scalar
22
21
  from flwr.server.client_manager import ClientManager
@@ -27,9 +26,7 @@ class Strategy(ABC):
27
26
  """Abstract base class for server strategy implementations."""
28
27
 
29
28
  @abstractmethod
30
- def initialize_parameters(
31
- self, client_manager: ClientManager
32
- ) -> Optional[Parameters]:
29
+ def initialize_parameters(self, client_manager: ClientManager) -> Parameters | None:
33
30
  """Initialize the (global) model parameters.
34
31
 
35
32
  Parameters
@@ -73,8 +70,8 @@ class Strategy(ABC):
73
70
  self,
74
71
  server_round: int,
75
72
  results: list[tuple[ClientProxy, FitRes]],
76
- failures: list[Union[tuple[ClientProxy, FitRes], BaseException]],
77
- ) -> tuple[Optional[Parameters], dict[str, Scalar]]:
73
+ failures: list[tuple[ClientProxy, FitRes] | BaseException],
74
+ ) -> tuple[Parameters | None, dict[str, Scalar]]:
78
75
  """Aggregate training results.
79
76
 
80
77
  Parameters
@@ -135,8 +132,8 @@ class Strategy(ABC):
135
132
  self,
136
133
  server_round: int,
137
134
  results: list[tuple[ClientProxy, EvaluateRes]],
138
- failures: list[Union[tuple[ClientProxy, EvaluateRes], BaseException]],
139
- ) -> tuple[Optional[float], dict[str, Scalar]]:
135
+ failures: list[tuple[ClientProxy, EvaluateRes] | BaseException],
136
+ ) -> tuple[float | None, dict[str, Scalar]]:
140
137
  """Aggregate evaluation results.
141
138
 
142
139
  Parameters
@@ -164,7 +161,7 @@ class Strategy(ABC):
164
161
  @abstractmethod
165
162
  def evaluate(
166
163
  self, server_round: int, parameters: Parameters
167
- ) -> Optional[tuple[float, dict[str, Scalar]]]:
164
+ ) -> tuple[float, dict[str, Scalar]] | None:
168
165
  """Evaluate the current model parameters.
169
166
 
170
167
  This function can be used to perform centralized (i.e., server-side) evaluation
@@ -15,8 +15,9 @@
15
15
  """Fleet API gRPC adapter servicer."""
16
16
 
17
17
 
18
+ from collections.abc import Callable
18
19
  from logging import DEBUG
19
- from typing import Callable, TypeVar
20
+ from typing import TypeVar
20
21
 
21
22
  import grpc
22
23
  from google.protobuf.message import Message as GrpcMessage
@@ -29,14 +30,15 @@ from flwr.common.constant import (
29
30
  GRPC_ADAPTER_METADATA_MESSAGE_QUALNAME_KEY,
30
31
  )
31
32
  from flwr.common.logger import log
32
- from flwr.common.version import package_name, package_version
33
33
  from flwr.proto import grpcadapter_pb2_grpc # pylint: disable=E0611
34
34
  from flwr.proto.fab_pb2 import GetFabRequest # pylint: disable=E0611
35
35
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
36
- CreateNodeRequest,
37
- DeleteNodeRequest,
36
+ ActivateNodeRequest,
37
+ DeactivateNodeRequest,
38
38
  PullMessagesRequest,
39
39
  PushMessagesRequest,
40
+ RegisterNodeFleetRequest,
41
+ UnregisterNodeFleetRequest,
40
42
  )
41
43
  from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
42
44
  from flwr.proto.heartbeat_pb2 import SendNodeHeartbeatRequest # pylint: disable=E0611
@@ -46,6 +48,7 @@ from flwr.proto.message_pb2 import ( # pylint: disable=E0611
46
48
  PushObjectRequest,
47
49
  )
48
50
  from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
51
+ from flwr.supercore.version import package_name, package_version
49
52
 
50
53
  from ..grpc_rere.fleet_servicer import FleetServicer
51
54
 
@@ -77,15 +80,23 @@ def _handle(
77
80
  class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer, FleetServicer):
78
81
  """Fleet API via GrpcAdapter servicer."""
79
82
 
80
- def SendReceive( # pylint: disable=too-many-return-statements
83
+ def SendReceive( # pylint: disable=too-many-return-statements, too-many-branches
81
84
  self, request: MessageContainer, context: grpc.ServicerContext
82
85
  ) -> MessageContainer:
83
86
  """."""
84
87
  log(DEBUG, "GrpcAdapterServicer.SendReceive")
85
- if request.grpc_message_name == CreateNodeRequest.__qualname__:
86
- return _handle(request, context, CreateNodeRequest, self.CreateNode)
87
- if request.grpc_message_name == DeleteNodeRequest.__qualname__:
88
- return _handle(request, context, DeleteNodeRequest, self.DeleteNode)
88
+ if request.grpc_message_name == RegisterNodeFleetRequest.__qualname__:
89
+ return _handle(
90
+ request, context, RegisterNodeFleetRequest, self.RegisterNode
91
+ )
92
+ if request.grpc_message_name == ActivateNodeRequest.__qualname__:
93
+ return _handle(request, context, ActivateNodeRequest, self.ActivateNode)
94
+ if request.grpc_message_name == DeactivateNodeRequest.__qualname__:
95
+ return _handle(request, context, DeactivateNodeRequest, self.DeactivateNode)
96
+ if request.grpc_message_name == UnregisterNodeFleetRequest.__qualname__:
97
+ return _handle(
98
+ request, context, UnregisterNodeFleetRequest, self.UnregisterNode
99
+ )
89
100
  if request.grpc_message_name == SendNodeHeartbeatRequest.__qualname__:
90
101
  return _handle(
91
102
  request, context, SendNodeHeartbeatRequest, self.SendNodeHeartbeat
@@ -20,8 +20,7 @@ Relevant knowledge for reading this modules code:
20
20
 
21
21
 
22
22
  import uuid
23
- from collections.abc import Iterator
24
- from typing import Callable
23
+ from collections.abc import Callable, Iterator
25
24
 
26
25
  import grpc
27
26
  from iterators import TimeoutIterator
@@ -19,7 +19,6 @@ from collections.abc import Iterator
19
19
  from dataclasses import dataclass
20
20
  from enum import Enum
21
21
  from threading import Condition
22
- from typing import Optional
23
22
 
24
23
  from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
25
24
  ClientMessage,
@@ -32,7 +31,7 @@ class InsWrapper:
32
31
  """Instruction wrapper class for a single server message."""
33
32
 
34
33
  server_message: ServerMessage
35
- timeout: Optional[float]
34
+ timeout: float | None
36
35
 
37
36
 
38
37
  @dataclass
@@ -70,8 +69,8 @@ class GrpcBridge:
70
69
  # pylint: disable=unsubscriptable-object
71
70
  self._cv = Condition() # cv stands for condition variable
72
71
  self._status = Status.AWAITING_INS_WRAPPER
73
- self._ins_wrapper: Optional[InsWrapper] = None
74
- self._res_wrapper: Optional[ResWrapper] = None
72
+ self._ins_wrapper: InsWrapper | None = None
73
+ self._res_wrapper: ResWrapper | None = None
75
74
 
76
75
  def _is_closed(self) -> bool:
77
76
  """Return True if closed and False otherwise."""
@@ -15,8 +15,6 @@
15
15
  """Flower ClientProxy implementation using gRPC bidirectional streaming."""
16
16
 
17
17
 
18
- from typing import Optional
19
-
20
18
  from flwr import common
21
19
  from flwr.common import serde
22
20
  from flwr.proto.transport_pb2 import ( # pylint: disable=E0611
@@ -45,8 +43,8 @@ class GrpcClientProxy(ClientProxy):
45
43
  def get_properties(
46
44
  self,
47
45
  ins: common.GetPropertiesIns,
48
- timeout: Optional[float],
49
- group_id: Optional[int],
46
+ timeout: float | None,
47
+ group_id: int | None,
50
48
  ) -> common.GetPropertiesRes:
51
49
  """Request client's set of internal properties."""
52
50
  get_properties_msg = serde.get_properties_ins_to_proto(ins)
@@ -65,8 +63,8 @@ class GrpcClientProxy(ClientProxy):
65
63
  def get_parameters(
66
64
  self,
67
65
  ins: common.GetParametersIns,
68
- timeout: Optional[float],
69
- group_id: Optional[int],
66
+ timeout: float | None,
67
+ group_id: int | None,
70
68
  ) -> common.GetParametersRes:
71
69
  """Return the current local model parameters."""
72
70
  get_parameters_msg = serde.get_parameters_ins_to_proto(ins)
@@ -85,8 +83,8 @@ class GrpcClientProxy(ClientProxy):
85
83
  def fit(
86
84
  self,
87
85
  ins: common.FitIns,
88
- timeout: Optional[float],
89
- group_id: Optional[int],
86
+ timeout: float | None,
87
+ group_id: int | None,
90
88
  ) -> common.FitRes:
91
89
  """Refine the provided parameters using the locally held dataset."""
92
90
  fit_ins_msg = serde.fit_ins_to_proto(ins)
@@ -104,8 +102,8 @@ class GrpcClientProxy(ClientProxy):
104
102
  def evaluate(
105
103
  self,
106
104
  ins: common.EvaluateIns,
107
- timeout: Optional[float],
108
- group_id: Optional[int],
105
+ timeout: float | None,
106
+ group_id: int | None,
109
107
  ) -> common.EvaluateRes:
110
108
  """Evaluate the provided parameters using the locally held dataset."""
111
109
  evaluate_msg = serde.evaluate_ins_to_proto(ins)
@@ -122,8 +120,8 @@ class GrpcClientProxy(ClientProxy):
122
120
  def reconnect(
123
121
  self,
124
122
  ins: common.ReconnectIns,
125
- timeout: Optional[float],
126
- group_id: Optional[int],
123
+ timeout: float | None,
124
+ group_id: int | None,
127
125
  ) -> common.DisconnectRes:
128
126
  """Disconnect and (optionally) reconnect later."""
129
127
  reconnect_ins_msg = serde.reconnect_ins_to_proto(ins)
@@ -15,8 +15,6 @@
15
15
  """Implements utility function to create a gRPC server."""
16
16
 
17
17
 
18
- from typing import Optional
19
-
20
18
  import grpc
21
19
 
22
20
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
@@ -36,7 +34,7 @@ def start_grpc_server( # pylint: disable=too-many-arguments,R0917
36
34
  max_concurrent_workers: int = 1000,
37
35
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
38
36
  keepalive_time_ms: int = 210000,
39
- certificates: Optional[tuple[bytes, bytes, bytes]] = None,
37
+ certificates: tuple[bytes, bytes, bytes] | None = None,
40
38
  ) -> grpc.Server:
41
39
  """Create and start a gRPC server running FlowerServiceServicer.
42
40