flwr 1.17.0__tar.gz → 1.18.0__tar.gz

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 (333) hide show
  1. {flwr-1.17.0 → flwr-1.18.0}/PKG-INFO +2 -2
  2. {flwr-1.17.0 → flwr-1.18.0}/README.md +1 -1
  3. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/__init__.py +1 -1
  4. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/__init__.py +1 -1
  5. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/app.py +21 -2
  6. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/build.py +1 -1
  7. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/cli_user_auth_interceptor.py +1 -1
  8. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/config_utils.py +53 -17
  9. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/example.py +1 -1
  10. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/install.py +1 -1
  11. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/log.py +1 -1
  12. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/login/__init__.py +1 -1
  13. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/login/login.py +12 -1
  14. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/ls.py +1 -1
  15. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/__init__.py +1 -1
  16. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/new.py +4 -4
  17. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/__init__.py +1 -1
  18. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/__init__.py +1 -1
  19. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/__init__.py +1 -1
  20. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +1 -1
  21. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +4 -4
  22. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +1 -1
  23. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  24. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +4 -4
  25. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  26. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  27. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  28. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  29. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  30. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  31. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  32. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/run/__init__.py +1 -1
  33. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/run/run.py +1 -1
  34. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/stop.py +1 -1
  35. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/utils.py +11 -12
  36. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/__init__.py +1 -1
  37. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/app.py +52 -52
  38. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/client.py +1 -1
  39. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/client_app.py +139 -137
  40. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/clientapp/__init__.py +1 -1
  41. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/clientapp/app.py +1 -1
  42. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/clientapp/clientappio_servicer.py +1 -1
  43. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/clientapp/utils.py +1 -1
  44. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/dpfedavg_numpy_client.py +1 -1
  45. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_adapter_client/__init__.py +1 -1
  46. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_adapter_client/connection.py +1 -1
  47. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_client/__init__.py +1 -1
  48. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_client/connection.py +13 -13
  49. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_rere_client/__init__.py +1 -1
  50. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  51. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_rere_client/connection.py +1 -1
  52. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/grpc_rere_client/grpc_adapter.py +1 -1
  53. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/heartbeat.py +1 -1
  54. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/message_handler/__init__.py +1 -1
  55. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/message_handler/message_handler.py +1 -1
  56. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/__init__.py +1 -1
  57. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/centraldp_mods.py +1 -1
  58. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/comms_mods.py +3 -3
  59. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/localdp_mod.py +6 -6
  60. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/secure_aggregation/__init__.py +1 -1
  61. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/secure_aggregation/secagg_mod.py +1 -1
  62. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
  63. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/mod/utils.py +1 -1
  64. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/nodestate/__init__.py +1 -1
  65. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/nodestate/in_memory_nodestate.py +1 -1
  66. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/nodestate/nodestate.py +1 -1
  67. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/nodestate/nodestate_factory.py +1 -1
  68. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/numpy_client.py +1 -1
  69. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/rest_client/__init__.py +1 -1
  70. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/rest_client/connection.py +1 -1
  71. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/run_info_store.py +1 -1
  72. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/supernode/__init__.py +1 -1
  73. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/supernode/app.py +1 -1
  74. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/client/typing.py +1 -1
  75. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/__init__.py +1 -1
  76. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/address.py +1 -1
  77. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/args.py +1 -1
  78. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/auth_plugin/__init__.py +1 -1
  79. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/auth_plugin/auth_plugin.py +1 -1
  80. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/config.py +1 -1
  81. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/constant.py +1 -1
  82. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/context.py +1 -1
  83. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/date.py +1 -1
  84. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/differential_privacy.py +1 -1
  85. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/differential_privacy_constants.py +1 -1
  86. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/dp.py +1 -1
  87. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/exit/exit.py +6 -6
  88. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/exit_handlers.py +1 -1
  89. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/grpc.py +1 -1
  90. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/logger.py +1 -1
  91. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/message.py +28 -11
  92. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/object_ref.py +1 -1
  93. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/parameter.py +1 -1
  94. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/pyproject.py +1 -1
  95. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/__init__.py +1 -1
  96. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/arrayrecord.py +31 -31
  97. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/configrecord.py +13 -13
  98. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/conversion_utils.py +1 -1
  99. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/metricrecord.py +16 -16
  100. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/recorddict.py +138 -89
  101. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/record/typeddict.py +1 -1
  102. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/retry_invoker.py +10 -10
  103. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/__init__.py +1 -1
  104. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/crypto/__init__.py +1 -1
  105. flwr-1.18.0/py/flwr/common/secure_aggregation/crypto/shamir.py +97 -0
  106. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -1
  107. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
  108. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/quantization.py +1 -1
  109. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  110. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
  111. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/serde.py +1 -1
  112. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/telemetry.py +2 -2
  113. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/typing.py +1 -1
  114. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/version.py +1 -1
  115. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/__init__.py +1 -1
  116. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/__init__.py +1 -1
  117. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/app.py +11 -11
  118. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/client_manager.py +1 -1
  119. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/client_proxy.py +1 -1
  120. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/compat/__init__.py +1 -1
  121. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/compat/app.py +1 -1
  122. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/compat/app_utils.py +1 -1
  123. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/compat/legacy_context.py +1 -1
  124. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/criterion.py +1 -1
  125. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/grid/grid.py +3 -3
  126. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/history.py +1 -1
  127. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/run_serverapp.py +1 -1
  128. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/server.py +1 -1
  129. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/server_app.py +65 -58
  130. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/server_config.py +1 -1
  131. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/serverapp/__init__.py +1 -1
  132. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/serverapp/app.py +1 -1
  133. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/serverapp_components.py +1 -1
  134. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/__init__.py +1 -1
  135. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/aggregate.py +1 -1
  136. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/bulyan.py +2 -2
  137. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/dp_adaptive_clipping.py +17 -17
  138. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/dp_fixed_clipping.py +17 -17
  139. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/dpfedavg_adaptive.py +1 -1
  140. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/dpfedavg_fixed.py +1 -1
  141. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fault_tolerant_fedavg.py +1 -1
  142. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedadagrad.py +1 -1
  143. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedadam.py +1 -1
  144. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedavg.py +1 -1
  145. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedavg_android.py +1 -1
  146. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedavgm.py +1 -1
  147. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedmedian.py +1 -1
  148. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedopt.py +1 -1
  149. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedprox.py +1 -1
  150. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedtrimmedavg.py +1 -1
  151. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedxgb_bagging.py +1 -1
  152. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedxgb_cyclic.py +1 -1
  153. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedxgb_nn_avg.py +3 -2
  154. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/fedyogi.py +1 -1
  155. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/krum.py +1 -1
  156. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/qfedavg.py +1 -1
  157. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/strategy/strategy.py +1 -1
  158. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/__init__.py +1 -1
  159. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/ffs/__init__.py +1 -1
  160. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/ffs/disk_ffs.py +1 -1
  161. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/ffs/ffs.py +1 -1
  162. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/ffs/ffs_factory.py +1 -1
  163. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/__init__.py +1 -1
  164. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +1 -1
  165. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +1 -1
  166. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +1 -1
  167. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
  168. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
  169. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
  170. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +13 -13
  171. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
  172. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +1 -1
  173. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -1
  174. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/message_handler/__init__.py +1 -1
  175. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -1
  176. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/rest_rere/__init__.py +1 -1
  177. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +1 -1
  178. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/vce/__init__.py +1 -1
  179. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
  180. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  181. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
  182. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/fleet/vce/vce_api.py +1 -1
  183. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/__init__.py +1 -1
  184. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +1 -1
  185. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/linkstate.py +1 -1
  186. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/linkstate_factory.py +1 -1
  187. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +1 -1
  188. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/linkstate/utils.py +1 -1
  189. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/simulation/__init__.py +1 -1
  190. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
  191. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/simulation/simulationio_servicer.py +1 -1
  192. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/utils.py +1 -1
  193. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/typing.py +1 -1
  194. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/utils/__init__.py +1 -1
  195. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/utils/tensorboard.py +1 -1
  196. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/utils/validator.py +1 -1
  197. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/__init__.py +1 -1
  198. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/constant.py +1 -1
  199. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/default_workflows.py +1 -1
  200. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/secure_aggregation/__init__.py +1 -1
  201. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -1
  202. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -1
  203. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/__init__.py +1 -1
  204. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/app.py +1 -1
  205. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/legacy_app.py +1 -1
  206. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/ray_transport/__init__.py +1 -1
  207. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/ray_transport/ray_actor.py +1 -1
  208. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
  209. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/ray_transport/utils.py +1 -1
  210. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/run_simulation.py +2 -2
  211. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/simulation/simulationio_connection.py +1 -1
  212. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/__init__.py +1 -1
  213. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/app.py +1 -1
  214. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/deployment.py +1 -1
  215. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/exec_grpc.py +1 -1
  216. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/exec_servicer.py +1 -1
  217. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/exec_user_auth_interceptor.py +1 -1
  218. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/executor.py +1 -1
  219. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/simulation.py +1 -1
  220. {flwr-1.17.0 → flwr-1.18.0}/pyproject.toml +11 -15
  221. flwr-1.17.0/LICENSE +0 -202
  222. flwr-1.17.0/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -75
  223. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/auth_plugin/__init__.py +0 -0
  224. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  225. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/constant.py +0 -0
  226. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  227. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  228. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  229. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  230. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  231. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  232. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  233. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  234. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  235. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  236. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  237. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  238. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  239. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  240. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  241. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  242. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  243. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  244. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  245. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  246. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  247. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  248. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  249. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  250. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  251. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  252. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  253. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  254. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  255. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  256. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  257. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  258. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  259. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  260. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  261. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  262. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  263. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/event_log_plugin/__init__.py +0 -0
  264. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  265. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/exit/__init__.py +0 -0
  266. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/exit/exit_code.py +0 -0
  267. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/common/recorddict_compat.py +0 -0
  268. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/clientappio_pb2.py +0 -0
  269. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/clientappio_pb2.pyi +0 -0
  270. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  271. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  272. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/error_pb2.py +0 -0
  273. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/error_pb2.pyi +0 -0
  274. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/error_pb2_grpc.py +0 -0
  275. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  276. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/exec_pb2.py +0 -0
  277. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/exec_pb2.pyi +0 -0
  278. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/exec_pb2_grpc.py +0 -0
  279. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  280. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fab_pb2.py +0 -0
  281. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fab_pb2.pyi +0 -0
  282. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fab_pb2_grpc.py +0 -0
  283. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  284. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fleet_pb2.py +0 -0
  285. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fleet_pb2.pyi +0 -0
  286. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  287. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  288. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/grpcadapter_pb2.py +0 -0
  289. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  290. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  291. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  292. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/log_pb2.py +0 -0
  293. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/log_pb2.pyi +0 -0
  294. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/log_pb2_grpc.py +0 -0
  295. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  296. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/message_pb2.py +0 -0
  297. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/message_pb2.pyi +0 -0
  298. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/message_pb2_grpc.py +0 -0
  299. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  300. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/node_pb2.py +0 -0
  301. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/node_pb2.pyi +0 -0
  302. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/node_pb2_grpc.py +0 -0
  303. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  304. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/recorddict_pb2.py +0 -0
  305. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/recorddict_pb2.pyi +0 -0
  306. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/recorddict_pb2_grpc.py +0 -0
  307. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/recorddict_pb2_grpc.pyi +0 -0
  308. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/run_pb2.py +0 -0
  309. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/run_pb2.pyi +0 -0
  310. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/run_pb2_grpc.py +0 -0
  311. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  312. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/serverappio_pb2.py +0 -0
  313. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/serverappio_pb2.pyi +0 -0
  314. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  315. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  316. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/simulationio_pb2.py +0 -0
  317. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/simulationio_pb2.pyi +0 -0
  318. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  319. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  320. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/transport_pb2.py +0 -0
  321. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/transport_pb2.pyi +0 -0
  322. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/transport_pb2_grpc.py +0 -0
  323. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  324. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/py.typed +0 -0
  325. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/compat/grid_client_proxy.py +0 -0
  326. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/fleet_event_log_interceptor.py +0 -0
  327. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/grid/__init__.py +0 -0
  328. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/grid/grpc_grid.py +0 -0
  329. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/grid/inmemory_grid.py +0 -0
  330. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/serverappio/__init__.py +0 -0
  331. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/serverappio/serverappio_grpc.py +0 -0
  332. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/server/superlink/serverappio/serverappio_servicer.py +0 -0
  333. {flwr-1.17.0/src → flwr-1.18.0}/py/flwr/superexec/exec_event_log_interceptor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr
3
- Version: 1.17.0
3
+ Version: 1.18.0
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -56,7 +56,7 @@ Description-Content-Type: text/markdown
56
56
 
57
57
  <p align="center">
58
58
  <a href="https://flower.ai/">
59
- <img src="https://flower.ai/_next/image/?url=%2F_next%2Fstatic%2Fmedia%2Fflower_white_border.c2012e70.png&w=640&q=75" width="140px" alt="Flower Website" />
59
+ <img src="https://flower.ai/_next/image/?url=%2F_next%2Fstatic%2Fmedia%2Fflwr-head.4d68867a.png&w=384&q=75" width="140px" alt="Flower Website" />
60
60
  </a>
61
61
  </p>
62
62
  <p align="center">
@@ -2,7 +2,7 @@
2
2
 
3
3
  <p align="center">
4
4
  <a href="https://flower.ai/">
5
- <img src="https://flower.ai/_next/image/?url=%2F_next%2Fstatic%2Fmedia%2Fflower_white_border.c2012e70.png&w=640&q=75" width="140px" alt="Flower Website" />
5
+ <img src="https://flower.ai/_next/image/?url=%2F_next%2Fstatic%2Fmedia%2Fflwr-head.4d68867a.png&w=384&q=75" width="140px" alt="Flower Website" />
6
6
  </a>
7
7
  </p>
8
8
  <p align="center">
@@ -1,4 +1,4 @@
1
- # Copyright 2020 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -14,10 +14,11 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface."""
16
16
 
17
-
18
17
  import typer
19
18
  from typer.main import get_command
20
19
 
20
+ from flwr.common.version import package_version
21
+
21
22
  from .build import build
22
23
  from .install import install
23
24
  from .log import log
@@ -34,6 +35,7 @@ app = typer.Typer(
34
35
  bold=True,
35
36
  ),
36
37
  no_args_is_help=True,
38
+ context_settings={"help_option_names": ["-h", "--help"]},
37
39
  )
38
40
 
39
41
  app.command()(new)
@@ -47,5 +49,22 @@ app.command()(login)
47
49
 
48
50
  typer_click_object = get_command(app)
49
51
 
52
+
53
+ @app.callback(invoke_without_command=True)
54
+ def version_callback(
55
+ ver: bool = typer.Option(
56
+ None,
57
+ "-V",
58
+ "--version",
59
+ is_eager=True,
60
+ help="Show the version and exit.",
61
+ ),
62
+ ) -> None:
63
+ """Print version."""
64
+ if ver:
65
+ typer.secho(f"Flower version: {package_version}", fg="blue")
66
+ raise typer.Exit()
67
+
68
+
50
69
  if __name__ == "__main__":
51
70
  app()
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -176,11 +176,32 @@ def validate_federation_in_project_config(
176
176
  def validate_certificate_in_federation_config(
177
177
  app: Path, federation_config: dict[str, Any]
178
178
  ) -> tuple[bool, Optional[bytes]]:
179
- """Validate the certificates in the Flower project configuration."""
180
- insecure_str = federation_config.get("insecure")
179
+ """Validate the certificates in the Flower project configuration.
180
+
181
+ Accepted configurations:
182
+ 1. TLS enabled and gRPC will load(*) the trusted certificate bundle:
183
+ - Only `address` is provided. `root-certificates` and `insecure` not set.
184
+ - `address` is provided and `insecure` set to `false`. `root-certificates` not
185
+ set.
186
+ (*)gRPC uses a multi-step fallback mechanism to load the trusted certificate
187
+ bundle in the following sequence:
188
+ a. A configured file path (if set via configuration or environment),
189
+ b. An override callback (if registered via
190
+ `grpc_set_ssl_roots_override_callback`),
191
+ c. The OS trust store (if available),
192
+ d. A bundled default certificate file.
193
+ 2. TLS enabled with self-signed certificates:
194
+ - `address` and `root-certificates` are provided. `insecure` not set.
195
+ - `address` and `root-certificates` are provided. `insecure` set to `false`.
196
+ 3. TLS disabled. This is not recommended and should only be used for prototyping:
197
+ - `address` is provided and `insecure = true`. If `root-certificates` is
198
+ set, exit with an error.
199
+ """
200
+ insecure = get_insecure_flag(federation_config)
201
+
202
+ # Process root certificates
181
203
  if root_certificates := federation_config.get("root-certificates"):
182
- root_certificates_bytes = (app / root_certificates).read_bytes()
183
- if insecure := bool(insecure_str):
204
+ if insecure:
184
205
  typer.secho(
185
206
  "❌ `root-certificates` were provided but the `insecure` parameter "
186
207
  "is set to `True`.",
@@ -188,22 +209,19 @@ def validate_certificate_in_federation_config(
188
209
  bold=True,
189
210
  )
190
211
  raise typer.Exit(code=1)
191
- else:
192
- root_certificates_bytes = None
193
- if insecure_str is None:
194
- typer.secho(
195
- "❌ To disable TLS, set `insecure = true` in `pyproject.toml`.",
196
- fg=typer.colors.RED,
197
- bold=True,
198
- )
199
- raise typer.Exit(code=1)
200
- if not (insecure := bool(insecure_str)):
212
+
213
+ # TLS is enabled with self-signed certificates: attempt to read the file
214
+ try:
215
+ root_certificates_bytes = (app / root_certificates).read_bytes()
216
+ except Exception as e:
201
217
  typer.secho(
202
- "❌ No certificate were given yet `insecure` is set to `False`.",
218
+ f"❌ Failed to read certificate file `{root_certificates}`: {e}",
203
219
  fg=typer.colors.RED,
204
220
  bold=True,
205
221
  )
206
- raise typer.Exit(code=1)
222
+ raise typer.Exit(code=1) from e
223
+ else:
224
+ root_certificates_bytes = None
207
225
 
208
226
  return insecure, root_certificates_bytes
209
227
 
@@ -218,3 +236,21 @@ def exit_if_no_address(federation_config: dict[str, Any], cmd: str) -> None:
218
236
  bold=True,
219
237
  )
220
238
  raise typer.Exit(code=1)
239
+
240
+
241
+ def get_insecure_flag(federation_config: dict[str, Any]) -> bool:
242
+ """Extract and validate the `insecure` flag from the federation configuration."""
243
+ insecure_value = federation_config.get("insecure")
244
+
245
+ if insecure_value is None:
246
+ # Not provided, default to False (TLS enabled)
247
+ return False
248
+ if isinstance(insecure_value, bool):
249
+ return insecure_value
250
+ typer.secho(
251
+ "❌ Invalid type for `insecure`: expected a boolean if provided. "
252
+ "(`insecure = true` or `insecure = false`)",
253
+ fg=typer.colors.RED,
254
+ bold=True,
255
+ )
256
+ raise typer.Exit(code=1)
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ import typer
22
22
 
23
23
  from flwr.cli.config_utils import (
24
24
  exit_if_no_address,
25
+ get_insecure_flag,
25
26
  load_and_validate,
26
27
  process_loaded_project_config,
27
28
  validate_federation_in_project_config,
@@ -80,6 +81,16 @@ def login( # pylint: disable=R0914
80
81
  bold=True,
81
82
  )
82
83
  raise typer.Exit(code=1)
84
+ # Check if insecure flag is set to `True`
85
+ insecure = get_insecure_flag(federation_config)
86
+ if insecure:
87
+ typer.secho(
88
+ "❌ `flwr login` requires TLS to be enabled. `insecure` must NOT be set to "
89
+ "`true` in the federation configuration.",
90
+ fg=typer.colors.RED,
91
+ bold=True,
92
+ )
93
+ raise typer.Exit(code=1)
83
94
 
84
95
  channel = init_channel(app, federation_config, None)
85
96
  stub = ExecStub(channel)
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -201,15 +201,15 @@ def new(
201
201
  if llm_challenge_str == "generalnlp":
202
202
  challenge_name = "General NLP"
203
203
  num_clients = "20"
204
- dataset_name = "vicgalle/alpaca-gpt4"
204
+ dataset_name = "flwrlabs/alpaca-gpt4"
205
205
  elif llm_challenge_str == "finance":
206
206
  challenge_name = "Finance"
207
207
  num_clients = "50"
208
- dataset_name = "FinGPT/fingpt-sentiment-train"
208
+ dataset_name = "flwrlabs/fingpt-sentiment-train"
209
209
  elif llm_challenge_str == "medical":
210
210
  challenge_name = "Medical"
211
211
  num_clients = "20"
212
- dataset_name = "medalpaca/medical_meadow_medical_flashcards"
212
+ dataset_name = "flwrlabs/medical-meadow-medical-flashcards"
213
213
  else:
214
214
  challenge_name = "Code"
215
215
  num_clients = "10"
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ class FlowerClient(NumPyClient):
49
49
  ): # pylint: disable=too-many-arguments
50
50
  self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
51
51
  self.train_cfg = train_cfg
52
- self.training_argumnets = TrainingArguments(**train_cfg.training_arguments)
52
+ self.training_arguments = TrainingArguments(**train_cfg.training_arguments)
53
53
  self.tokenizer = tokenizer
54
54
  self.formatting_prompts_func = formatting_prompts_func
55
55
  self.data_collator = data_collator
@@ -72,14 +72,14 @@ class FlowerClient(NumPyClient):
72
72
  self.train_cfg.learning_rate_min,
73
73
  )
74
74
 
75
- self.training_argumnets.learning_rate = new_lr
76
- self.training_argumnets.output_dir = config["save_path"]
75
+ self.training_arguments.learning_rate = new_lr
76
+ self.training_arguments.output_dir = config["save_path"]
77
77
 
78
78
  # Construct trainer
79
79
  trainer = SFTTrainer(
80
80
  model=self.model,
81
81
  tokenizer=self.tokenizer,
82
- args=self.training_argumnets,
82
+ args=self.training_arguments,
83
83
  max_seq_length=self.train_cfg.seq_length,
84
84
  train_dataset=self.trainset,
85
85
  formatting_func=self.formatting_prompts_func,
@@ -15,7 +15,7 @@ def load_data(partition_id: int, num_partitions: int):
15
15
  if fds is None:
16
16
  partitioner = IidPartitioner(num_partitions=num_partitions)
17
17
  fds = FederatedDataset(
18
- dataset="mnist",
18
+ dataset="ylecun/mnist",
19
19
  partitioners={"train": partitioner},
20
20
  )
21
21
 
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "torchvision==0.20.1",
@@ -8,14 +8,14 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets>=0.5.0",
13
- "torch==2.3.1",
13
+ "torch==2.4.0",
14
14
  "trl==0.8.1",
15
- "bitsandbytes==0.45.0",
15
+ "bitsandbytes==0.45.4",
16
16
  "scipy==1.13.0",
17
17
  "peft==0.6.2",
18
- "transformers==4.47.0",
18
+ "transformers==4.50.3",
19
19
  "sentencepiece==0.2.0",
20
20
  "omegaconf==2.3.0",
21
21
  "hf_transfer==0.1.8",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "transformers>=4.30.0,<5.0",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "jax==0.4.30",
13
13
  "jaxlib==0.4.30",
14
14
  "scikit-learn==1.6.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "mlx==0.21.1",
14
14
  ]
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "numpy>=2.0.2",
13
13
  ]
14
14
 
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "torch==2.5.1",
14
14
  "torchvision==0.20.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "scikit-learn>=1.6.1",
14
14
  ]
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.17.0",
11
+ "flwr[simulation]>=1.18.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "tensorflow>=2.11.1,<2.18.0",
14
14
  ]
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -220,17 +220,6 @@ def try_obtain_cli_auth_plugin(
220
220
  if not federation_config.get("enable-user-auth", False):
221
221
  return None
222
222
 
223
- # Check if TLS is enabled. If not, raise an error
224
- if federation_config.get("root-certificates") is None:
225
- typer.secho(
226
- "❌ User authentication requires TLS to be enabled. "
227
- "Please provide 'root-certificates' in the federation"
228
- " configuration.",
229
- fg=typer.colors.RED,
230
- bold=True,
231
- )
232
- raise typer.Exit(code=1)
233
-
234
223
  config_path = get_user_auth_config_path(root_dir, federation)
235
224
 
236
225
  # Get the auth type from the config if not provided
@@ -273,6 +262,16 @@ def init_channel(
273
262
  # Initialize the CLI-side user auth interceptor
274
263
  interceptors: list[grpc.UnaryUnaryClientInterceptor] = []
275
264
  if auth_plugin is not None:
265
+ # Check if TLS is enabled. If not, raise an error
266
+ if insecure:
267
+ typer.secho(
268
+ "❌ User authentication requires TLS to be enabled. "
269
+ "Remove `insecure = true` from the federation configuration.",
270
+ fg=typer.colors.RED,
271
+ bold=True,
272
+ )
273
+ raise typer.Exit(code=1)
274
+
276
275
  auth_plugin.load_tokens()
277
276
  interceptors.append(CliUserAuthInterceptor(auth_plugin))
278
277
 
@@ -1,4 +1,4 @@
1
- # Copyright 2020 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.