flwr 1.15.0__tar.gz → 1.15.2__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.15.0 → flwr-1.15.2}/PKG-INFO +2 -2
  2. {flwr-1.15.0 → flwr-1.15.2}/pyproject.toml +2 -2
  3. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +2 -2
  4. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/new.py +1 -1
  5. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +4 -4
  6. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/README.md.tpl +1 -1
  7. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  8. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  9. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  10. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  11. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  12. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  13. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  14. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  15. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  16. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/utils.py +2 -2
  17. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/constant.py +9 -7
  18. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/exit_handlers.py +17 -29
  19. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/object_ref.py +0 -14
  20. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/task_pb2.py +6 -6
  21. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/task_pb2.pyi +1 -4
  22. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/app.py +2 -2
  23. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/driver/inmemory_driver.py +0 -1
  24. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +8 -12
  25. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +17 -4
  26. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -4
  27. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -1
  28. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -6
  29. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/utils/validator.py +0 -3
  30. {flwr-1.15.0 → flwr-1.15.2}/LICENSE +0 -0
  31. {flwr-1.15.0 → flwr-1.15.2}/README.md +0 -0
  32. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/__init__.py +0 -0
  33. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/__init__.py +0 -0
  34. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/app.py +0 -0
  35. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/auth_plugin/__init__.py +0 -0
  36. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/build.py +0 -0
  37. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  38. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/config_utils.py +0 -0
  39. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/constant.py +0 -0
  40. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/example.py +0 -0
  41. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/install.py +0 -0
  42. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/log.py +0 -0
  43. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/login/__init__.py +0 -0
  44. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/login/login.py +0 -0
  45. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/ls.py +0 -0
  46. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/__init__.py +0 -0
  47. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  48. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  49. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  50. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  51. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  52. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  53. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  54. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  55. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  56. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  57. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  58. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  59. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  60. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  61. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  62. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  63. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  64. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  65. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  66. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  67. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  68. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  69. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  70. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  71. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  72. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  73. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  74. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  75. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  76. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  77. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  78. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  79. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  80. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  81. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  82. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  83. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  84. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  85. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  86. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  87. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  88. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/run/__init__.py +0 -0
  89. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/run/run.py +0 -0
  90. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/cli/stop.py +0 -0
  91. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/__init__.py +0 -0
  92. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/app.py +0 -0
  93. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/client.py +0 -0
  94. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/client_app.py +0 -0
  95. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/clientapp/__init__.py +0 -0
  96. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/clientapp/app.py +0 -0
  97. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  98. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/clientapp/utils.py +0 -0
  99. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  100. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  101. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  102. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  103. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_client/connection.py +0 -0
  104. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  105. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  106. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  107. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  108. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/heartbeat.py +0 -0
  109. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/message_handler/__init__.py +0 -0
  110. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  111. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  112. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/__init__.py +0 -0
  113. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  114. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/comms_mods.py +0 -0
  115. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  116. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  117. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  118. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  119. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/mod/utils.py +0 -0
  120. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/nodestate/__init__.py +0 -0
  121. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  122. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  123. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  124. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/numpy_client.py +0 -0
  125. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/rest_client/__init__.py +0 -0
  126. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/rest_client/connection.py +0 -0
  127. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/run_info_store.py +0 -0
  128. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/supernode/__init__.py +0 -0
  129. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/supernode/app.py +0 -0
  130. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/client/typing.py +0 -0
  131. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/__init__.py +0 -0
  132. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/address.py +0 -0
  133. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/args.py +0 -0
  134. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  135. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  136. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/config.py +0 -0
  137. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/context.py +0 -0
  138. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/date.py +0 -0
  139. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/differential_privacy.py +0 -0
  140. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  141. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/dp.py +0 -0
  142. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/exit/__init__.py +0 -0
  143. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/exit/exit.py +0 -0
  144. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/exit/exit_code.py +0 -0
  145. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/grpc.py +0 -0
  146. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/logger.py +0 -0
  147. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/message.py +0 -0
  148. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/parameter.py +0 -0
  149. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/pyproject.py +0 -0
  150. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/__init__.py +0 -0
  151. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/configsrecord.py +0 -0
  152. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/conversion_utils.py +0 -0
  153. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/metricsrecord.py +0 -0
  154. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/parametersrecord.py +0 -0
  155. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/recordset.py +0 -0
  156. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/record/typeddict.py +0 -0
  157. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/recordset_compat.py +0 -0
  158. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/retry_invoker.py +0 -0
  159. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  160. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  161. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  162. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  163. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  164. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  165. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  166. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  167. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/serde.py +0 -0
  168. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/telemetry.py +0 -0
  169. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/typing.py +0 -0
  170. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/common/version.py +0 -0
  171. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/__init__.py +0 -0
  172. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  173. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  174. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  175. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  176. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/error_pb2.py +0 -0
  177. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/error_pb2.pyi +0 -0
  178. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  179. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  180. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/exec_pb2.py +0 -0
  181. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  182. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  183. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  184. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fab_pb2.py +0 -0
  185. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  186. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  187. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  188. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fleet_pb2.py +0 -0
  189. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  190. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  191. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  192. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  193. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  194. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  195. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  196. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/log_pb2.py +0 -0
  197. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/log_pb2.pyi +0 -0
  198. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  199. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  200. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/message_pb2.py +0 -0
  201. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/message_pb2.pyi +0 -0
  202. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  203. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  204. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/node_pb2.py +0 -0
  205. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/node_pb2.pyi +0 -0
  206. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  207. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  208. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/recordset_pb2.py +0 -0
  209. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  210. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  211. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  212. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/run_pb2.py +0 -0
  213. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/run_pb2.pyi +0 -0
  214. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  215. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  216. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  217. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  218. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  219. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  220. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  221. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  222. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  223. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  224. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  225. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  226. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/transport_pb2.py +0 -0
  227. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  228. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  229. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  230. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/py.typed +0 -0
  231. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/__init__.py +0 -0
  232. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/client_manager.py +0 -0
  233. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/client_proxy.py +0 -0
  234. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/compat/__init__.py +0 -0
  235. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/compat/app.py +0 -0
  236. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/compat/app_utils.py +0 -0
  237. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  238. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/compat/legacy_context.py +0 -0
  239. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/criterion.py +0 -0
  240. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/driver/__init__.py +0 -0
  241. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/driver/driver.py +0 -0
  242. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  243. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/history.py +0 -0
  244. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/run_serverapp.py +0 -0
  245. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/server.py +0 -0
  246. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/server_app.py +0 -0
  247. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/server_config.py +0 -0
  248. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/serverapp/__init__.py +0 -0
  249. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/serverapp/app.py +0 -0
  250. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/serverapp_components.py +0 -0
  251. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/__init__.py +0 -0
  252. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/aggregate.py +0 -0
  253. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/bulyan.py +0 -0
  254. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  255. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  256. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  257. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  258. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  259. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  260. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedadam.py +0 -0
  261. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedavg.py +0 -0
  262. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  263. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  264. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  265. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedopt.py +0 -0
  266. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedprox.py +0 -0
  267. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  268. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  269. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  270. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  271. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  272. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/krum.py +0 -0
  273. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  274. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/strategy/strategy.py +0 -0
  275. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/__init__.py +0 -0
  276. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  277. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  278. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  279. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  280. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  281. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  282. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  283. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  284. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  285. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  286. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  287. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  288. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  289. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  290. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  291. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  292. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  293. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  294. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  295. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  296. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  297. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  298. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  299. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  300. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  301. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  302. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  303. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  304. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  305. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  306. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  307. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/superlink/utils.py +0 -0
  308. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/typing.py +0 -0
  309. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/utils/__init__.py +0 -0
  310. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/utils/tensorboard.py +0 -0
  311. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/__init__.py +0 -0
  312. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/constant.py +0 -0
  313. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  314. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  315. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  316. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  317. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/__init__.py +0 -0
  318. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/app.py +0 -0
  319. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/legacy_app.py +0 -0
  320. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  321. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  322. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  323. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  324. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/run_simulation.py +0 -0
  325. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  326. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/__init__.py +0 -0
  327. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/app.py +0 -0
  328. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/deployment.py +0 -0
  329. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/exec_grpc.py +0 -0
  330. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/exec_servicer.py +0 -0
  331. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  332. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/executor.py +0 -0
  333. {flwr-1.15.0 → flwr-1.15.2}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr
3
- Version: 1.15.0
3
+ Version: 1.15.2
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -40,7 +40,7 @@ Requires-Dist: pathspec (>=0.12.1,<0.13.0)
40
40
  Requires-Dist: protobuf (>=4.21.6,<5.0.0)
41
41
  Requires-Dist: pycryptodome (>=3.18.0,<4.0.0)
42
42
  Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
43
- Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
43
+ Requires-Dist: ray (==2.31.0) ; (python_version >= "3.9" and python_version < "3.13") and (extra == "simulation")
44
44
  Requires-Dist: requests (>=2.31.0,<3.0.0)
45
45
  Requires-Dist: rich (>=13.5.0,<14.0.0)
46
46
  Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr"
7
- version = "1.15.0"
7
+ version = "1.15.2"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -81,7 +81,7 @@ rich = "^13.5.0"
81
81
  pyyaml = "^6.0.2"
82
82
  requests = "^2.31.0"
83
83
  # Optional dependencies (Simulation Engine)
84
- ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
84
+ ray = { version = "==2.31.0", optional = true, python = ">=3.9,<3.13" }
85
85
  # Optional dependencies (REST transport layer)
86
86
  starlette = { version = "^0.45.2", optional = true }
87
87
  uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
@@ -26,7 +26,7 @@ import typer
26
26
  from flwr.common.auth_plugin import CliAuthPlugin
27
27
  from flwr.common.constant import (
28
28
  ACCESS_TOKEN_KEY,
29
- AUTH_TYPE_KEY,
29
+ AUTH_TYPE_JSON_KEY,
30
30
  REFRESH_TOKEN_KEY,
31
31
  AuthType,
32
32
  )
@@ -97,7 +97,7 @@ class OidcCliPlugin(CliAuthPlugin):
97
97
  self.access_token = credentials.access_token
98
98
  self.refresh_token = credentials.refresh_token
99
99
  json_dict = {
100
- AUTH_TYPE_KEY: AuthType.OIDC,
100
+ AUTH_TYPE_JSON_KEY: AuthType.OIDC,
101
101
  ACCESS_TOKEN_KEY: credentials.access_token,
102
102
  REFRESH_TOKEN_KEY: credentials.refresh_token,
103
103
  }
@@ -213,7 +213,7 @@ def new(
213
213
  else:
214
214
  challenge_name = "Code"
215
215
  num_clients = "10"
216
- dataset_name = "lucasmccabe-lmi/CodeAlpaca-20k"
216
+ dataset_name = "flwrlabs/code-alpaca-20k"
217
217
 
218
218
  context["llm_challenge_str"] = llm_challenge_str
219
219
  context["fraction_fit"] = fraction_fit
@@ -13,7 +13,7 @@ dataset: [dataset1, dataset2] # TODO: list of datasets you include in your basel
13
13
 
14
14
  > [!IMPORTANT]
15
15
  > To help having all baselines similarly formatted and structured, we have included two scripts in `baselines/dev` that when run will format your code and run some tests checking if it's formatted.
16
- > These checks use standard packages such as `isort`, `black`, `pylint` and others. You as a baseline creator will need to install additional pacakges. These are already specified in the `pyproject.toml` of
16
+ > These checks use standard packages such as `isort`, `black`, `pylint` and others. You as a baseline creator will need to install additional packages. These are already specified in the `pyproject.toml` of
17
17
  > your baseline. Follow these steps:
18
18
 
19
19
  ```bash
@@ -66,9 +66,9 @@ cd .. # so you are in the `flower/baselines` directory
66
66
 
67
67
  ## About this baseline
68
68
 
69
- **What’s implemented:** :warning: *_Concisely describe what experiment(s) (e.g. Figure 1, Table 2, etc) in the publication can be replicated by running the code. Please only use a few sentences. ”_*
69
+ **What’s implemented:** :warning: *_Concisely describe what experiment(s) (e.g. Figure 1, Table 2, etc.) in the publication can be replicated by running the code. Please only use a few sentences. ”_*
70
70
 
71
- **Datasets:** :warning: *_List the datasets you used (if you used a medium to large dataset, >10GB please also include the sizes of the dataset). We highly recommend using [FlowerDatasets](https://flower.ai/docs/datasets/index.html) to download and partition your dataset. If you have other ways to download the data, you can also use `FlowerDatasets` to partiion it._*
71
+ **Datasets:** :warning: *_List the datasets you used (if you used a medium to large dataset, >10GB please also include the sizes of the dataset). We highly recommend using [FlowerDatasets](https://flower.ai/docs/datasets/index.html) to download and partition your dataset. If you have other ways to download the data, you can also use `FlowerDatasets` to partition it._*
72
72
 
73
73
  **Hardware Setup:** :warning: *_Give some details about the hardware (e.g. a server with 8x V100 32GB and 256GB of RAM) you used to run the experiments for this baseline. Indicate how long it took to run the experiments. Someone out there might not have access to the same resources you have so, could you list the absolute minimum hardware needed to run the experiment in a reasonable amount of time ? (e.g. minimum is 1x 16GB GPU otherwise a client model can’t be trained with a sufficiently large batch size). Could you test this works too?_*
74
74
 
@@ -122,6 +122,6 @@ flwr run . --run-config learning-rate=0.1,coefficient=0.123
122
122
  flwr run . --run-config <my-big-experiment-config>.toml
123
123
  ```
124
124
 
125
- :warning: _It is preferable to show a single commmand (or multilple commands if they belong to the same experiment) and then a table/plot with the expected results, instead of showing all the commands first and then all the results/plots._
125
+ :warning: _It is preferable to show a single command (or multiple commands if they belong to the same experiment) and then a table/plot with the expected results, instead of showing all the commands first and then all the results/plots._
126
126
  :warning: _If you present plots or other figures, please include either a Jupyter notebook showing how to create them or include a utility function that can be called after the experiments finish running._
127
127
  :warning: If you include plots or figures, save them in `.png` format and place them in a new directory named `_static` at the same level as your `README.md`.
@@ -18,7 +18,7 @@ Refer to the [How to Run Simulations](https://flower.ai/docs/framework/how-to-ru
18
18
 
19
19
  ## Run with the Deployment Engine
20
20
 
21
- Follow this [how-to guide](https://flower.ai/docs/framework/how-to-run-flower-with-deployment-engine.html) to run the same app in this example but with Flower's Deployment Engine. After that, you might be intersted in setting up [secure TLS-enabled communications](https://flower.ai/docs/framework/how-to-enable-tls-connections.html) and [SuperNode authentication](https://flower.ai/docs/framework/how-to-authenticate-supernodes.html) in your federation.
21
+ Follow this [how-to guide](https://flower.ai/docs/framework/how-to-run-flower-with-deployment-engine.html) to run the same app in this example but with Flower's Deployment Engine. After that, you might be interested in setting up [secure TLS-enabled communications](https://flower.ai/docs/framework/how-to-enable-tls-connections.html) and [SuperNode authentication](https://flower.ai/docs/framework/how-to-authenticate-supernodes.html) in your federation.
22
22
 
23
23
  You can run Flower on Docker too! Check out the [Flower with Docker](https://flower.ai/docs/framework/docker/index.html) documentation.
24
24
 
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
12
12
  "flwr-datasets>=0.5.0",
13
13
  "torch==2.3.1",
14
14
  "trl==0.8.1",
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
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.15.0",
11
+ "flwr[simulation]>=1.15.2",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "tensorflow>=2.11.1,<2.18.0",
14
14
  ]
@@ -28,7 +28,7 @@ import typer
28
28
 
29
29
  from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
30
30
  from flwr.common.auth_plugin import CliAuthPlugin
31
- from flwr.common.constant import AUTH_TYPE_KEY, CREDENTIALS_DIR, FLWR_DIR
31
+ from flwr.common.constant import AUTH_TYPE_JSON_KEY, CREDENTIALS_DIR, FLWR_DIR
32
32
  from flwr.common.grpc import (
33
33
  GRPC_MAX_MESSAGE_LENGTH,
34
34
  create_channel,
@@ -239,7 +239,7 @@ def try_obtain_cli_auth_plugin(
239
239
  try:
240
240
  with config_path.open("r", encoding="utf-8") as file:
241
241
  json_file = json.load(file)
242
- auth_type = json_file[AUTH_TYPE_KEY]
242
+ auth_type = json_file[AUTH_TYPE_JSON_KEY]
243
243
  except (FileNotFoundError, KeyError):
244
244
  typer.secho(
245
245
  "❌ Missing or invalid credentials for user authentication. "
@@ -108,15 +108,17 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
108
108
 
109
109
  # Constants for user authentication
110
110
  CREDENTIALS_DIR = ".credentials"
111
- AUTH_TYPE_KEY = "auth_type"
112
- ACCESS_TOKEN_KEY = "access_token"
113
- REFRESH_TOKEN_KEY = "refresh_token"
111
+ AUTH_TYPE_JSON_KEY = "auth-type" # For key name in JSON file
112
+ AUTH_TYPE_YAML_KEY = "auth_type" # For key name in YAML file
113
+ ACCESS_TOKEN_KEY = "flwr-oidc-access-token"
114
+ REFRESH_TOKEN_KEY = "flwr-oidc-refresh-token"
114
115
 
115
116
  # Constants for node authentication
116
- PUBLIC_KEY_HEADER = "public-key-bin" # Must end with "-bin" for binary data
117
- SIGNATURE_HEADER = "signature-bin" # Must end with "-bin" for binary data
118
- TIMESTAMP_HEADER = "timestamp"
119
- TIMESTAMP_TOLERANCE = 10 # Tolerance for timestamp verification
117
+ PUBLIC_KEY_HEADER = "flwr-public-key-bin" # Must end with "-bin" for binary data
118
+ SIGNATURE_HEADER = "flwr-signature-bin" # Must end with "-bin" for binary data
119
+ TIMESTAMP_HEADER = "flwr-timestamp"
120
+ TIMESTAMP_TOLERANCE = 10 # General tolerance for timestamp verification
121
+ SYSTEM_TIME_TOLERANCE = 5 # Allowance for system time drift
120
122
 
121
123
 
122
124
  class MessageType:
@@ -15,10 +15,10 @@
15
15
  """Common function to register exit handlers for server and client."""
16
16
 
17
17
 
18
- from signal import SIGINT, SIGQUIT, SIGTERM, signal
18
+ import signal
19
19
  from threading import Thread
20
20
  from types import FrameType
21
- from typing import Optional
21
+ from typing import Callable, Optional
22
22
 
23
23
  from grpc import Server
24
24
 
@@ -26,12 +26,15 @@ from flwr.common.telemetry import EventType
26
26
 
27
27
  from .exit import ExitCode, flwr_exit
28
28
 
29
- SIGNAL_TO_EXIT_CODE = {
30
- SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
31
- SIGQUIT: ExitCode.GRACEFUL_EXIT_SIGQUIT,
32
- SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
29
+ SIGNAL_TO_EXIT_CODE: dict[int, int] = {
30
+ signal.SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
31
+ signal.SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
33
32
  }
34
33
 
34
+ # SIGQUIT is not available on Windows
35
+ if hasattr(signal, "SIGQUIT"):
36
+ SIGNAL_TO_EXIT_CODE[signal.SIGQUIT] = ExitCode.GRACEFUL_EXIT_SIGQUIT
37
+
35
38
 
36
39
  def register_exit_handlers(
37
40
  event_type: EventType,
@@ -54,23 +57,16 @@ def register_exit_handlers(
54
57
  An optional list of threads that need to be gracefully
55
58
  terminated before exiting.
56
59
  """
57
- default_handlers = {
58
- SIGINT: None,
59
- SIGQUIT: None,
60
- SIGTERM: None,
61
- }
62
-
63
- def graceful_exit_handler( # type: ignore
64
- signalnum,
65
- frame: FrameType, # pylint: disable=unused-argument
66
- ) -> None:
60
+ default_handlers: dict[int, Callable[[int, FrameType], None]] = {}
61
+
62
+ def graceful_exit_handler(signalnum: int, _frame: FrameType) -> None:
67
63
  """Exit handler to be registered with `signal.signal`.
68
64
 
69
65
  When called will reset signal handler to original signal handler from
70
66
  default_handlers.
71
67
  """
72
68
  # Reset to default handler
73
- signal(signalnum, default_handlers[signalnum])
69
+ signal.signal(signalnum, default_handlers[signalnum]) # type: ignore
74
70
 
75
71
  if grpc_servers is not None:
76
72
  for grpc_server in grpc_servers:
@@ -87,15 +83,7 @@ def register_exit_handlers(
87
83
  event_type=event_type,
88
84
  )
89
85
 
90
- default_handlers[SIGINT] = signal( # type: ignore
91
- SIGINT,
92
- graceful_exit_handler, # type: ignore
93
- )
94
- default_handlers[SIGQUIT] = signal( # type: ignore
95
- SIGQUIT,
96
- graceful_exit_handler, # type: ignore
97
- )
98
- default_handlers[SIGTERM] = signal( # type: ignore
99
- SIGTERM,
100
- graceful_exit_handler, # type: ignore
101
- )
86
+ # Register signal handlers
87
+ for sig in SIGNAL_TO_EXIT_CODE:
88
+ default_handler = signal.signal(sig, graceful_exit_handler) # type: ignore
89
+ default_handlers[sig] = default_handler # type: ignore
@@ -19,13 +19,10 @@ import ast
19
19
  import importlib
20
20
  import sys
21
21
  from importlib.util import find_spec
22
- from logging import WARN
23
22
  from pathlib import Path
24
23
  from threading import Lock
25
24
  from typing import Any, Optional, Union
26
25
 
27
- from .logger import log
28
-
29
26
  OBJECT_REF_HELP_STR = """
30
27
  \n\nThe object reference string should have the form <module>:<attribute>. Valid
31
28
  examples include `client:app` and `project.package.module:wrapper.app`. It must
@@ -171,17 +168,6 @@ def load_app( # pylint: disable= too-many-branches
171
168
  # Import the module
172
169
  if module_str not in sys.modules:
173
170
  module = importlib.import_module(module_str)
174
- # Hack: `tabnet` does not work with `importlib.reload`
175
- elif "tabnet" in sys.modules:
176
- log(
177
- WARN,
178
- "Cannot reload module `%s` from disk due to compatibility issues "
179
- "with the `tabnet` library. The module will be loaded from the "
180
- "cache instead. If you experience issues, consider restarting "
181
- "the application.",
182
- module_str,
183
- )
184
- module = sys.modules[module_str]
185
171
  else:
186
172
  module = sys.modules[module_str]
187
173
  _reload_modules(project_dir)
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
17
  from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
18
18
 
19
19
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\x89\x02\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x11\n\tpushed_at\x18\x05 \x01(\x01\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x16\x66lwr/proto/error.proto\"\xf6\x01\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x0b\n\x03ttl\x18\x06 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x07 \x03(\t\x12\x11\n\ttask_type\x18\x08 \x01(\t\x12(\n\trecordset\x18\t \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\n \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
21
21
 
22
22
  _globals = globals()
23
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -25,9 +25,9 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.task_pb2', _glob
25
25
  if _descriptor._USE_C_DESCRIPTORS == False:
26
26
  DESCRIPTOR._options = None
27
27
  _globals['_TASK']._serialized_start=113
28
- _globals['_TASK']._serialized_end=378
29
- _globals['_TASKINS']._serialized_start=380
30
- _globals['_TASKINS']._serialized_end=472
31
- _globals['_TASKRES']._serialized_start=474
32
- _globals['_TASKRES']._serialized_end=566
28
+ _globals['_TASK']._serialized_end=359
29
+ _globals['_TASKINS']._serialized_start=361
30
+ _globals['_TASKINS']._serialized_end=453
31
+ _globals['_TASKRES']._serialized_start=455
32
+ _globals['_TASKRES']._serialized_end=547
33
33
  # @@protoc_insertion_point(module_scope)
@@ -20,7 +20,6 @@ class Task(google.protobuf.message.Message):
20
20
  CONSUMER_FIELD_NUMBER: builtins.int
21
21
  CREATED_AT_FIELD_NUMBER: builtins.int
22
22
  DELIVERED_AT_FIELD_NUMBER: builtins.int
23
- PUSHED_AT_FIELD_NUMBER: builtins.int
24
23
  TTL_FIELD_NUMBER: builtins.int
25
24
  ANCESTRY_FIELD_NUMBER: builtins.int
26
25
  TASK_TYPE_FIELD_NUMBER: builtins.int
@@ -32,7 +31,6 @@ class Task(google.protobuf.message.Message):
32
31
  def consumer(self) -> flwr.proto.node_pb2.Node: ...
33
32
  created_at: builtins.float
34
33
  delivered_at: typing.Text
35
- pushed_at: builtins.float
36
34
  ttl: builtins.float
37
35
  @property
38
36
  def ancestry(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
@@ -47,7 +45,6 @@ class Task(google.protobuf.message.Message):
47
45
  consumer: typing.Optional[flwr.proto.node_pb2.Node] = ...,
48
46
  created_at: builtins.float = ...,
49
47
  delivered_at: typing.Text = ...,
50
- pushed_at: builtins.float = ...,
51
48
  ttl: builtins.float = ...,
52
49
  ancestry: typing.Optional[typing.Iterable[typing.Text]] = ...,
53
50
  task_type: typing.Text = ...,
@@ -55,7 +52,7 @@ class Task(google.protobuf.message.Message):
55
52
  error: typing.Optional[flwr.proto.error_pb2.Error] = ...,
56
53
  ) -> None: ...
57
54
  def HasField(self, field_name: typing_extensions.Literal["consumer",b"consumer","error",b"error","producer",b"producer","recordset",b"recordset"]) -> builtins.bool: ...
58
- def ClearField(self, field_name: typing_extensions.Literal["ancestry",b"ancestry","consumer",b"consumer","created_at",b"created_at","delivered_at",b"delivered_at","error",b"error","producer",b"producer","pushed_at",b"pushed_at","recordset",b"recordset","task_type",b"task_type","ttl",b"ttl"]) -> None: ...
55
+ def ClearField(self, field_name: typing_extensions.Literal["ancestry",b"ancestry","consumer",b"consumer","created_at",b"created_at","delivered_at",b"delivered_at","error",b"error","producer",b"producer","recordset",b"recordset","task_type",b"task_type","ttl",b"ttl"]) -> None: ...
59
56
  global___Task = Task
60
57
 
61
58
  class TaskIns(google.protobuf.message.Message):
@@ -40,7 +40,7 @@ from flwr.common.args import try_obtain_server_certificates
40
40
  from flwr.common.auth_plugin import ExecAuthPlugin
41
41
  from flwr.common.config import get_flwr_dir, parse_config_args
42
42
  from flwr.common.constant import (
43
- AUTH_TYPE_KEY,
43
+ AUTH_TYPE_YAML_KEY,
44
44
  CLIENT_OCTET,
45
45
  EXEC_API_DEFAULT_SERVER_ADDRESS,
46
46
  FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
@@ -578,7 +578,7 @@ def _try_obtain_exec_auth_plugin(
578
578
 
579
579
  # Load authentication configuration
580
580
  auth_config: dict[str, Any] = config.get("authentication", {})
581
- auth_type: str = auth_config.get(AUTH_TYPE_KEY, "")
581
+ auth_type: str = auth_config.get(AUTH_TYPE_YAML_KEY, "")
582
582
 
583
583
  # Load authentication plugin
584
584
  try:
@@ -126,7 +126,6 @@ class InMemoryDriver(Driver):
126
126
  # Convert Message to TaskIns
127
127
  taskins = message_to_taskins(msg)
128
128
  # Store in state
129
- taskins.task.pushed_at = time.time()
130
129
  task_id = self.state.store_task_ins(taskins)
131
130
  if task_id:
132
131
  task_ids.append(str(task_id))
@@ -22,7 +22,7 @@ from uuid import UUID
22
22
 
23
23
  import grpc
24
24
 
25
- from flwr.common import ConfigsRecord, now
25
+ from flwr.common import ConfigsRecord
26
26
  from flwr.common.constant import Status
27
27
  from flwr.common.logger import log
28
28
  from flwr.common.serde import (
@@ -151,9 +151,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
151
151
  context,
152
152
  )
153
153
 
154
- # Set pushed_at (timestamp in seconds)
155
- pushed_at = now().timestamp()
156
-
157
154
  # Validate request and insert in State
158
155
  _raise_if(
159
156
  validation_error=len(request.messages_list) == 0,
@@ -165,7 +162,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
165
162
  message_proto = request.messages_list.pop(0)
166
163
  message = message_from_proto(message_proto=message_proto)
167
164
  task_ins = message_to_taskins(message=message)
168
- task_ins.task.pushed_at = pushed_at
169
165
  validation_errors = validate_task_ins_or_res(task_ins)
170
166
  _raise_if(
171
167
  validation_error=bool(validation_errors),
@@ -212,6 +208,13 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
212
208
  # Read from state
213
209
  task_res_list: list[TaskRes] = state.get_task_res(task_ids=message_ids)
214
210
 
211
+ # Delete the TaskIns/TaskRes pairs if TaskRes is found
212
+ task_ins_ids_to_delete = {
213
+ UUID(task_res.task.ancestry[0]) for task_res in task_res_list
214
+ }
215
+
216
+ state.delete_tasks(task_ins_ids=task_ins_ids_to_delete)
217
+
215
218
  # Convert to Messages
216
219
  messages_list = []
217
220
  while task_res_list:
@@ -224,13 +227,6 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
224
227
  message = message_from_taskres(taskres=task_res)
225
228
  messages_list.append(message_to_proto(message))
226
229
 
227
- # Delete the TaskIns/TaskRes pairs if TaskRes is found
228
- task_ins_ids_to_delete = {
229
- UUID(task_res.task.ancestry[0]) for task_res in task_res_list
230
- }
231
-
232
- state.delete_tasks(task_ins_ids=task_ins_ids_to_delete)
233
-
234
230
  return PullResMessagesResponse(messages_list=messages_list)
235
231
 
236
232
  def GetRun(
@@ -25,6 +25,7 @@ from flwr.common import now
25
25
  from flwr.common.constant import (
26
26
  PUBLIC_KEY_HEADER,
27
27
  SIGNATURE_HEADER,
28
+ SYSTEM_TIME_TOLERANCE,
28
29
  TIMESTAMP_HEADER,
29
30
  TIMESTAMP_TOLERANCE,
30
31
  )
@@ -38,10 +39,15 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
38
39
  )
39
40
  from flwr.server.superlink.linkstate import LinkStateFactory
40
41
 
42
+ MIN_TIMESTAMP_DIFF = -SYSTEM_TIME_TOLERANCE
43
+ MAX_TIMESTAMP_DIFF = TIMESTAMP_TOLERANCE + SYSTEM_TIME_TOLERANCE
41
44
 
42
- def _unary_unary_rpc_terminator(message: str) -> grpc.RpcMethodHandler:
45
+
46
+ def _unary_unary_rpc_terminator(
47
+ message: str, code: Any = grpc.StatusCode.UNAUTHENTICATED
48
+ ) -> grpc.RpcMethodHandler:
43
49
  def terminate(_request: GrpcMessage, context: grpc.ServicerContext) -> GrpcMessage:
44
- context.abort(grpc.StatusCode.UNAUTHENTICATED, message)
50
+ context.abort(code, message)
45
51
  raise RuntimeError("Should not reach this point") # Make mypy happy
46
52
 
47
53
  return grpc.unary_unary_rpc_method_handler(terminate)
@@ -64,7 +70,7 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
64
70
  self.state_factory = state_factory
65
71
  self.auto_auth = auto_auth
66
72
 
67
- def intercept_service(
73
+ def intercept_service( # pylint: disable=too-many-return-statements
68
74
  self,
69
75
  continuation: Callable[[Any], Any],
70
76
  handler_call_details: grpc.HandlerCallDetails,
@@ -75,6 +81,13 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
75
81
  metadata sent by the node. Continue RPC call if node is authenticated, else,
76
82
  terminate RPC call by setting context to abort.
77
83
  """
84
+ # Filter out non-Fleet service calls
85
+ if not handler_call_details.method.startswith("/flwr.proto.Fleet/"):
86
+ return _unary_unary_rpc_terminator(
87
+ "This request should be sent to a different service.",
88
+ grpc.StatusCode.FAILED_PRECONDITION,
89
+ )
90
+
78
91
  state = self.state_factory.state()
79
92
  metadata_dict = dict(handler_call_details.invocation_metadata)
80
93
 
@@ -100,7 +113,7 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
100
113
  current = now()
101
114
  time_diff = current - datetime.datetime.fromisoformat(timestamp_iso)
102
115
  # Abort the RPC call if the timestamp is too old or in the future
103
- if not 0 < time_diff.total_seconds() < TIMESTAMP_TOLERANCE:
116
+ if not MIN_TIMESTAMP_DIFF < time_diff.total_seconds() < MAX_TIMESTAMP_DIFF:
104
117
  return _unary_unary_rpc_terminator("Invalid timestamp")
105
118
 
106
119
  # Continue the RPC call
@@ -15,7 +15,6 @@
15
15
  """Fleet API message handlers."""
16
16
 
17
17
 
18
- import time
19
18
  from typing import Optional
20
19
  from uuid import UUID
21
20
 
@@ -122,9 +121,6 @@ def push_messages(
122
121
  if abort_msg:
123
122
  raise InvalidRunStatusException(abort_msg)
124
123
 
125
- # Set pushed_at (timestamp in seconds)
126
- task_res.task.pushed_at = time.time()
127
-
128
124
  # Store TaskRes in State
129
125
  message_id: Optional[UUID] = state.store_task_res(task_res=task_res)
130
126
 
@@ -140,7 +140,6 @@ def worker(
140
140
  # Convert to TaskRes
141
141
  task_res = message_to_taskres(out_mssg)
142
142
  # Store TaskRes in state
143
- task_res.task.pushed_at = time.time()
144
143
  taskres_queue.put(task_res)
145
144
 
146
145
 
@@ -126,7 +126,6 @@ CREATE TABLE IF NOT EXISTS task_ins(
126
126
  consumer_node_id INTEGER,
127
127
  created_at REAL,
128
128
  delivered_at TEXT,
129
- pushed_at REAL,
130
129
  ttl REAL,
131
130
  ancestry TEXT,
132
131
  task_type TEXT,
@@ -144,7 +143,6 @@ CREATE TABLE IF NOT EXISTS task_res(
144
143
  consumer_node_id INTEGER,
145
144
  created_at REAL,
146
145
  delivered_at TEXT,
147
- pushed_at REAL,
148
146
  ttl REAL,
149
147
  ancestry TEXT,
150
148
  task_type TEXT,
@@ -1053,7 +1051,6 @@ def task_ins_to_dict(task_msg: TaskIns) -> dict[str, Any]:
1053
1051
  "consumer_node_id": task_msg.task.consumer.node_id,
1054
1052
  "created_at": task_msg.task.created_at,
1055
1053
  "delivered_at": task_msg.task.delivered_at,
1056
- "pushed_at": task_msg.task.pushed_at,
1057
1054
  "ttl": task_msg.task.ttl,
1058
1055
  "ancestry": ",".join(task_msg.task.ancestry),
1059
1056
  "task_type": task_msg.task.task_type,
@@ -1072,7 +1069,6 @@ def task_res_to_dict(task_msg: TaskRes) -> dict[str, Any]:
1072
1069
  "consumer_node_id": task_msg.task.consumer.node_id,
1073
1070
  "created_at": task_msg.task.created_at,
1074
1071
  "delivered_at": task_msg.task.delivered_at,
1075
- "pushed_at": task_msg.task.pushed_at,
1076
1072
  "ttl": task_msg.task.ttl,
1077
1073
  "ancestry": ",".join(task_msg.task.ancestry),
1078
1074
  "task_type": task_msg.task.task_type,
@@ -1099,7 +1095,6 @@ def dict_to_task_ins(task_dict: dict[str, Any]) -> TaskIns:
1099
1095
  ),
1100
1096
  created_at=task_dict["created_at"],
1101
1097
  delivered_at=task_dict["delivered_at"],
1102
- pushed_at=task_dict["pushed_at"],
1103
1098
  ttl=task_dict["ttl"],
1104
1099
  ancestry=task_dict["ancestry"].split(","),
1105
1100
  task_type=task_dict["task_type"],
@@ -1127,7 +1122,6 @@ def dict_to_task_res(task_dict: dict[str, Any]) -> TaskRes:
1127
1122
  ),
1128
1123
  created_at=task_dict["created_at"],
1129
1124
  delivered_at=task_dict["delivered_at"],
1130
- pushed_at=task_dict["pushed_at"],
1131
1125
  ttl=task_dict["ttl"],
1132
1126
  ancestry=task_dict["ancestry"].split(","),
1133
1127
  task_type=task_dict["task_type"],
@@ -45,9 +45,6 @@ def validate_task_ins_or_res(tasks_ins_res: Union[TaskIns, TaskRes]) -> list[str
45
45
  validation_errors.append("`delivered_at` must be an empty str")
46
46
  if tasks_ins_res.task.ttl <= 0:
47
47
  validation_errors.append("`ttl` must be higher than zero")
48
- if tasks_ins_res.task.pushed_at < 1711497600.0:
49
- # unix timestamp of 27 March 2024 00h:00m:00s UTC
50
- validation_errors.append("`pushed_at` is not a recent timestamp")
51
48
 
52
49
  # Verify TTL and created_at time
53
50
  current_time = time.time()
File without changes