flwr-nightly 1.16.0.dev20250310__tar.gz → 1.17.0.dev20250312__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 (331) hide show
  1. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/PKG-INFO +1 -1
  2. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/pyproject.toml +1 -5
  3. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +1 -1
  4. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
  5. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
  6. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  7. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  8. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  9. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  10. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  11. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  12. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  13. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/client_app.py +0 -9
  14. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/clientapp/app.py +4 -0
  15. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/supernode/__init__.py +0 -2
  16. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/supernode/app.py +1 -11
  17. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/telemetry.py +0 -10
  18. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/run_serverapp.py +2 -13
  19. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/app.py +0 -14
  20. flwr_nightly-1.17.0.dev20250312/src/py/flwr/superexec/exec_event_log_interceptor.py +135 -0
  21. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/exec_user_auth_interceptor.py +18 -2
  22. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/LICENSE +0 -0
  23. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/README.md +0 -0
  24. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/__init__.py +0 -0
  25. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/__init__.py +0 -0
  26. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/app.py +0 -0
  27. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/auth_plugin/__init__.py +0 -0
  28. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +0 -0
  29. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/build.py +0 -0
  30. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  31. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/config_utils.py +0 -0
  32. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/constant.py +0 -0
  33. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/example.py +0 -0
  34. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/install.py +0 -0
  35. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/log.py +0 -0
  36. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/login/__init__.py +0 -0
  37. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/login/login.py +0 -0
  38. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/ls.py +0 -0
  39. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/__init__.py +0 -0
  40. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/new.py +0 -0
  41. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  42. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  43. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  44. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  45. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  46. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  47. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  48. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  50. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  51. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  52. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  53. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  54. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  55. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  56. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  57. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  58. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  59. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  61. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  62. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  63. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  64. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  65. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  67. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  68. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  69. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  70. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  71. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  72. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  73. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  74. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  75. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  76. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  77. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  78. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  79. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  80. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  81. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  82. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  83. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/run/__init__.py +0 -0
  84. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/run/run.py +0 -0
  85. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/stop.py +0 -0
  86. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/cli/utils.py +0 -0
  87. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/__init__.py +0 -0
  88. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/app.py +0 -0
  89. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/client.py +0 -0
  90. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/clientapp/__init__.py +0 -0
  91. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  92. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/clientapp/utils.py +0 -0
  93. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  94. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  95. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  96. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  97. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_client/connection.py +0 -0
  98. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  99. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  100. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  101. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  102. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/heartbeat.py +0 -0
  103. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/message_handler/__init__.py +0 -0
  104. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  105. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/__init__.py +0 -0
  106. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  107. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/comms_mods.py +0 -0
  108. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  109. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  110. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  111. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  112. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/mod/utils.py +0 -0
  113. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/nodestate/__init__.py +0 -0
  114. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  115. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  116. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  117. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/numpy_client.py +0 -0
  118. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/rest_client/__init__.py +0 -0
  119. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/rest_client/connection.py +0 -0
  120. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/run_info_store.py +0 -0
  121. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/client/typing.py +0 -0
  122. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/__init__.py +0 -0
  123. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/address.py +0 -0
  124. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/args.py +0 -0
  125. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  126. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  127. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/config.py +0 -0
  128. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/constant.py +0 -0
  129. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/event_log_plugin/__init__.py +0 -0
  135. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/event_log_plugin/event_log_plugin.py +0 -0
  136. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/exit/__init__.py +0 -0
  137. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/exit/exit.py +0 -0
  138. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/exit/exit_code.py +0 -0
  139. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/exit_handlers.py +0 -0
  140. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/grpc.py +0 -0
  141. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/logger.py +0 -0
  142. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/message.py +0 -0
  143. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/object_ref.py +0 -0
  144. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/parameter.py +0 -0
  145. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/pyproject.py +0 -0
  146. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/__init__.py +0 -0
  147. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/configsrecord.py +0 -0
  148. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/conversion_utils.py +0 -0
  149. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/metricsrecord.py +0 -0
  150. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/parametersrecord.py +0 -0
  151. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/recordset.py +0 -0
  152. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/record/typeddict.py +0 -0
  153. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/recordset_compat.py +0 -0
  154. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/retry_invoker.py +0 -0
  155. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  156. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  157. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  158. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  159. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  160. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  161. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  162. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  163. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/serde.py +0 -0
  164. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/typing.py +0 -0
  165. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/common/version.py +0 -0
  166. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/__init__.py +0 -0
  167. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  168. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  169. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  170. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  171. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/error_pb2.py +0 -0
  172. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/error_pb2.pyi +0 -0
  173. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/exec_pb2.py +0 -0
  176. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  177. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fab_pb2.py +0 -0
  180. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  181. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fleet_pb2.py +0 -0
  184. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  185. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  188. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  189. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/log_pb2.py +0 -0
  192. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/log_pb2.pyi +0 -0
  193. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/message_pb2.py +0 -0
  196. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/message_pb2.pyi +0 -0
  197. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/node_pb2.py +0 -0
  200. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/node_pb2.pyi +0 -0
  201. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/recordset_pb2.py +0 -0
  204. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  205. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/run_pb2.py +0 -0
  208. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/run_pb2.pyi +0 -0
  209. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  212. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  213. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  216. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  217. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/transport_pb2.py +0 -0
  220. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  221. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/py.typed +0 -0
  224. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/__init__.py +0 -0
  225. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/app.py +0 -0
  226. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/client_manager.py +0 -0
  227. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/client_proxy.py +0 -0
  228. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/compat/__init__.py +0 -0
  229. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/compat/app.py +0 -0
  230. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/compat/app_utils.py +0 -0
  231. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  232. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/compat/legacy_context.py +0 -0
  233. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/criterion.py +0 -0
  234. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/driver/__init__.py +0 -0
  235. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/driver/driver.py +0 -0
  236. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  237. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  238. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/history.py +0 -0
  239. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/server.py +0 -0
  240. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/server_app.py +0 -0
  241. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/server_config.py +0 -0
  242. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/serverapp/__init__.py +0 -0
  243. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/serverapp/app.py +0 -0
  244. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/serverapp_components.py +0 -0
  245. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/__init__.py +0 -0
  246. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/aggregate.py +0 -0
  247. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/bulyan.py +0 -0
  248. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  249. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  250. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  251. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  252. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  253. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  254. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedadam.py +0 -0
  255. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedavg.py +0 -0
  256. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  257. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  258. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  259. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedopt.py +0 -0
  260. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedprox.py +0 -0
  261. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  262. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  263. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  264. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  265. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  266. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/krum.py +0 -0
  267. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  268. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/strategy/strategy.py +0 -0
  269. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/__init__.py +0 -0
  270. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  271. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  272. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  273. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  274. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  275. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  276. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  277. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  278. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  279. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  280. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  281. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  282. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  283. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  284. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  285. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  286. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  287. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  288. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  289. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  290. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  291. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  292. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  293. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  294. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  295. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  296. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  297. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  298. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  299. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  300. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  301. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  302. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  303. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  304. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  305. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  306. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/superlink/utils.py +0 -0
  307. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/typing.py +0 -0
  308. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/utils/__init__.py +0 -0
  309. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/utils/tensorboard.py +0 -0
  310. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/utils/validator.py +0 -0
  311. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/__init__.py +0 -0
  312. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/constant.py +0 -0
  313. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  314. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  315. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  316. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  317. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/__init__.py +0 -0
  318. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/app.py +0 -0
  319. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/legacy_app.py +0 -0
  320. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  321. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  322. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  323. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  324. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/run_simulation.py +0 -0
  325. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  326. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/__init__.py +0 -0
  327. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/deployment.py +0 -0
  328. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/exec_grpc.py +0 -0
  329. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/exec_servicer.py +0 -0
  330. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/executor.py +0 -0
  331. {flwr_nightly-1.16.0.dev20250310 → flwr_nightly-1.17.0.dev20250312}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.16.0.dev20250310
3
+ Version: 1.17.0.dev20250312
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.16.0.dev20250310"
7
+ version = "1.17.0.dev20250312"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -51,8 +51,6 @@ exclude = ["src/py/**/*_test.py"]
51
51
  [tool.poetry.scripts]
52
52
  # `flwr` CLI
53
53
  flwr = "flwr.cli.app:app"
54
- # SuperExec (can run with either Deployment Engine or Simulation Engine)
55
- flower-superexec = "flwr.superexec.app:run_superexec" # Deprecated
56
54
  # Simulation Engine
57
55
  flwr-simulation = "flwr.simulation.app:flwr_simulation"
58
56
  flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
@@ -60,9 +58,7 @@ flower-simulation = "flwr.simulation.run_simulation:run_simulation_from_cli"
60
58
  flower-superlink = "flwr.server.app:run_superlink"
61
59
  flower-supernode = "flwr.client.supernode.app:run_supernode"
62
60
  flwr-serverapp = "flwr.server.serverapp:flwr_serverapp"
63
- flower-server-app = "flwr.server.run_serverapp:run_server_app" # Deprecated
64
61
  flwr-clientapp = "flwr.client.clientapp:flwr_clientapp"
65
- flower-client-app = "flwr.client.supernode:run_client_app" # Deprecated
66
62
 
67
63
  [tool.poetry.dependencies]
68
64
  python = "^3.9.2"
@@ -35,7 +35,7 @@ warnings.filterwarnings("ignore", category=UserWarning)
35
35
  # pylint: disable=too-many-arguments
36
36
  # pylint: disable=too-many-instance-attributes
37
37
  class FlowerClient(NumPyClient):
38
- """Standard Flower client for CNN training."""
38
+ """Flower client for LLM fine-tuning."""
39
39
 
40
40
  def __init__(
41
41
  self,
@@ -8,7 +8,7 @@ version = "1.0.0"
8
8
  description = ""
9
9
  license = "Apache-2.0"
10
10
  dependencies = [
11
- "flwr[simulation]>=1.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.0",
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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.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.16.0",
11
+ "flwr[simulation]>=1.17.0",
12
12
  "flwr-datasets[vision]>=0.5.0",
13
13
  "tensorflow>=2.11.1,<2.18.0",
14
14
  ]
@@ -102,15 +102,6 @@ class ClientApp:
102
102
  >>> return FlowerClient().to_client()
103
103
  >>>
104
104
  >>> app = ClientApp(client_fn)
105
-
106
- If the above code is in a Python module called `client`, it can be started as
107
- follows:
108
-
109
- >>> flower-client-app client:app --insecure
110
-
111
- In this `client:app` example, `client` refers to the Python module `client.py` in
112
- which the previous code lives in and `app` refers to the global attribute `app` that
113
- points to an object of type `ClientApp`.
114
105
  """
115
106
 
116
107
  def __init__(
@@ -16,6 +16,7 @@
16
16
 
17
17
 
18
18
  import argparse
19
+ import gc
19
20
  import time
20
21
  from logging import DEBUG, ERROR, INFO
21
22
  from typing import Optional
@@ -160,6 +161,9 @@ def run_clientapp( # pylint: disable=R0914
160
161
  stub=stub, token=token, message=reply_message, context=context
161
162
  )
162
163
 
164
+ del client_app, message, context, run, fab, reply_message
165
+ gc.collect()
166
+
163
167
  # Reset token to `None` to prevent flwr-clientapp from trying to pull the
164
168
  # same inputs again
165
169
  token = None
@@ -15,10 +15,8 @@
15
15
  """Flower SuperNode."""
16
16
 
17
17
 
18
- from .app import run_client_app as run_client_app
19
18
  from .app import run_supernode as run_supernode
20
19
 
21
20
  __all__ = [
22
- "run_client_app",
23
21
  "run_supernode",
24
22
  ]
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
  import argparse
19
- from logging import DEBUG, ERROR, INFO, WARN
19
+ from logging import DEBUG, INFO, WARN
20
20
  from pathlib import Path
21
21
  from typing import Optional
22
22
 
@@ -98,16 +98,6 @@ def run_supernode() -> None:
98
98
  )
99
99
 
100
100
 
101
- def run_client_app() -> None:
102
- """Run Flower client app."""
103
- event(EventType.RUN_CLIENT_APP_ENTER)
104
- log(
105
- ERROR,
106
- "The command `flower-client-app` has been replaced by `flwr run`.",
107
- )
108
- register_exit_handlers(event_type=EventType.RUN_CLIENT_APP_LEAVE)
109
-
110
-
111
101
  def _parse_args_run_supernode() -> argparse.ArgumentParser:
112
102
  """Parse flower-supernode command line arguments."""
113
103
  parser = argparse.ArgumentParser(
@@ -181,16 +181,6 @@ class EventType(str, Enum):
181
181
  RUN_SUPERNODE_ENTER = auto()
182
182
  RUN_SUPERNODE_LEAVE = auto()
183
183
 
184
- # --- DEPRECATED -------------------------------------------------------------------
185
-
186
- # [DEPRECATED] CLI: `flower-server-app`
187
- RUN_SERVER_APP_ENTER = auto()
188
- RUN_SERVER_APP_LEAVE = auto()
189
-
190
- # [DEPRECATED] CLI: `flower-client-app`
191
- RUN_CLIENT_APP_ENTER = auto()
192
- RUN_CLIENT_APP_LEAVE = auto()
193
-
194
184
 
195
185
  # Use the ThreadPoolExecutor with max_workers=1 to have a queue
196
186
  # and also ensure that telemetry calls are not blocking.
@@ -15,11 +15,10 @@
15
15
  """Run ServerApp."""
16
16
 
17
17
 
18
- from logging import DEBUG, ERROR
18
+ from logging import DEBUG
19
19
  from typing import Optional
20
20
 
21
- from flwr.common import Context, EventType, event
22
- from flwr.common.exit_handlers import register_exit_handlers
21
+ from flwr.common import Context
23
22
  from flwr.common.logger import log
24
23
  from flwr.common.object_ref import load_app
25
24
 
@@ -64,13 +63,3 @@ def run(
64
63
 
65
64
  log(DEBUG, "ServerApp finished running.")
66
65
  return context
67
-
68
-
69
- def run_server_app() -> None:
70
- """Run Flower server app."""
71
- event(EventType.RUN_SERVER_APP_ENTER)
72
- log(
73
- ERROR,
74
- "The command `flower-server-app` has been replaced by `flwr run`.",
75
- )
76
- register_exit_handlers(event_type=EventType.RUN_SERVER_APP_LEAVE)
@@ -16,26 +16,12 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
- from logging import INFO
21
19
 
22
- from flwr.common import log
23
20
  from flwr.common.object_ref import load_app, validate
24
21
 
25
22
  from .executor import Executor
26
23
 
27
24
 
28
- def run_superexec() -> None:
29
- """Run Flower SuperExec."""
30
- log(INFO, "Starting Flower SuperExec")
31
-
32
- sys.exit(
33
- "Manually launching the SuperExec is deprecated. Since `flwr 1.13.0` "
34
- "the executor service runs in the SuperLink. Launching it manually is not "
35
- "recommended."
36
- )
37
-
38
-
39
25
  def load_executor(
40
26
  args: argparse.Namespace,
41
27
  ) -> Executor:
@@ -0,0 +1,135 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower Exec API event log interceptor."""
16
+
17
+
18
+ from collections.abc import Iterator
19
+ from typing import Any, Callable, Union, cast
20
+
21
+ import grpc
22
+ from google.protobuf.message import Message as GrpcMessage
23
+
24
+ from flwr.common.event_log_plugin.event_log_plugin import EventLogWriterPlugin
25
+ from flwr.common.typing import LogEntry
26
+
27
+ from .exec_user_auth_interceptor import shared_user_info
28
+
29
+
30
+ class ExecEventLogInterceptor(grpc.ServerInterceptor): # type: ignore
31
+ """Exec API interceptor for logging events."""
32
+
33
+ def __init__(self, log_plugin: EventLogWriterPlugin) -> None:
34
+ self.log_plugin = log_plugin
35
+
36
+ def intercept_service(
37
+ self,
38
+ continuation: Callable[[Any], Any],
39
+ handler_call_details: grpc.HandlerCallDetails,
40
+ ) -> grpc.RpcMethodHandler:
41
+ """Flower server interceptor logging logic.
42
+
43
+ Intercept all unary-unary/unary-stream calls from users and log the event.
44
+ Continue RPC call if event logger is enabled on the SuperLink, else, terminate
45
+ RPC call by setting context to abort.
46
+ """
47
+ # One of the method handlers in
48
+ # `flwr.superexec.exec_servicer.ExecServicer`
49
+ method_handler: grpc.RpcMethodHandler = continuation(handler_call_details)
50
+ method_name: str = handler_call_details.method
51
+ return self._generic_event_log_unary_method_handler(method_handler, method_name)
52
+
53
+ def _generic_event_log_unary_method_handler(
54
+ self, method_handler: grpc.RpcMethodHandler, method_name: str
55
+ ) -> grpc.RpcMethodHandler:
56
+ def _generic_method_handler(
57
+ request: GrpcMessage,
58
+ context: grpc.ServicerContext,
59
+ ) -> Union[GrpcMessage, Iterator[GrpcMessage], Exception]:
60
+ log_entry: LogEntry
61
+ # Log before call
62
+ log_entry = self.log_plugin.compose_log_before_event(
63
+ request=request,
64
+ context=context,
65
+ user_info=shared_user_info.get(),
66
+ method_name=method_name,
67
+ )
68
+ self.log_plugin.write_log(log_entry)
69
+
70
+ # For unary-unary calls, log after the call immediately
71
+ if method_handler.unary_unary:
72
+ unary_response, error = None, None
73
+ try:
74
+ unary_response = cast(
75
+ GrpcMessage, method_handler.unary_unary(request, context)
76
+ )
77
+ except Exception as e: # pylint: disable=broad-except
78
+ error = e
79
+ raise
80
+ finally:
81
+ log_entry = self.log_plugin.compose_log_after_event(
82
+ request=request,
83
+ context=context,
84
+ user_info=shared_user_info.get(),
85
+ method_name=method_name,
86
+ response=unary_response or error,
87
+ )
88
+ self.log_plugin.write_log(log_entry)
89
+ return unary_response
90
+
91
+ # For unary-stream calls, wrap the response iterator and write the event log
92
+ # after iteration completes
93
+ if method_handler.unary_stream:
94
+ response_iterator = cast(
95
+ Iterator[GrpcMessage],
96
+ method_handler.unary_stream(request, context),
97
+ )
98
+
99
+ def response_wrapper() -> Iterator[GrpcMessage]:
100
+ stream_response, error = None, None
101
+ try:
102
+ # pylint: disable=use-yield-from
103
+ for stream_response in response_iterator:
104
+ yield stream_response
105
+ except Exception as e: # pylint: disable=broad-except
106
+ error = e
107
+ raise
108
+ finally:
109
+ # This block is executed after the client has consumed
110
+ # the entire stream, or if iteration is interrupted
111
+ log_entry = self.log_plugin.compose_log_after_event(
112
+ request=request,
113
+ context=context,
114
+ user_info=shared_user_info.get(),
115
+ method_name=method_name,
116
+ response=stream_response or error,
117
+ )
118
+ self.log_plugin.write_log(log_entry)
119
+
120
+ return response_wrapper()
121
+
122
+ raise RuntimeError() # This line is unreachable
123
+
124
+ if method_handler.unary_unary:
125
+ message_handler = grpc.unary_unary_rpc_method_handler
126
+ elif method_handler.unary_stream:
127
+ message_handler = grpc.unary_stream_rpc_method_handler
128
+ else:
129
+ # If the method type is not `unary_unary` or `unary_stream`, raise an error
130
+ raise NotImplementedError("This RPC method type is not supported.")
131
+ return message_handler(
132
+ _generic_method_handler,
133
+ request_deserializer=method_handler.request_deserializer,
134
+ response_serializer=method_handler.response_serializer,
135
+ )
@@ -15,11 +15,13 @@
15
15
  """Flower Exec API interceptor."""
16
16
 
17
17
 
18
- from typing import Any, Callable, Union
18
+ import contextvars
19
+ from typing import Any, Callable, Union, cast
19
20
 
20
21
  import grpc
21
22
 
22
23
  from flwr.common.auth_plugin import ExecAuthPlugin
24
+ from flwr.common.typing import UserInfo
23
25
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
24
26
  GetAuthTokensRequest,
25
27
  GetAuthTokensResponse,
@@ -43,6 +45,11 @@ Response = Union[
43
45
  ]
44
46
 
45
47
 
48
+ shared_user_info: contextvars.ContextVar[UserInfo] = contextvars.ContextVar(
49
+ "user_info", default=UserInfo(user_id=None, user_name=None)
50
+ )
51
+
52
+
46
53
  class ExecUserAuthInterceptor(grpc.ServerInterceptor): # type: ignore
47
54
  """Exec API interceptor for user authentication."""
48
55
 
@@ -77,13 +84,22 @@ class ExecUserAuthInterceptor(grpc.ServerInterceptor): # type: ignore
77
84
  ) -> Response:
78
85
  call = method_handler.unary_unary or method_handler.unary_stream
79
86
  metadata = context.invocation_metadata()
87
+
88
+ # Intercept GetLoginDetails and GetAuthTokens requests, and return
89
+ # the response without authentication
80
90
  if isinstance(request, (GetLoginDetailsRequest, GetAuthTokensRequest)):
81
91
  return call(request, context) # type: ignore
82
92
 
83
- valid_tokens, _ = self.auth_plugin.validate_tokens_in_metadata(metadata)
93
+ # For other requests, check if the user is authenticated
94
+ valid_tokens, user_info = self.auth_plugin.validate_tokens_in_metadata(
95
+ metadata
96
+ )
84
97
  if valid_tokens:
98
+ # Store user info in contextvars for authenticated users
99
+ shared_user_info.set(cast(UserInfo, user_info))
85
100
  return call(request, context) # type: ignore
86
101
 
102
+ # If the user is not authenticated, refresh tokens
87
103
  tokens = self.auth_plugin.refresh_tokens(context.invocation_metadata())
88
104
  if tokens is not None:
89
105
  context.send_initial_metadata(tokens)