flwr-nightly 1.15.0.dev20250107__tar.gz → 1.15.0.dev20250112__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 (329) hide show
  1. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/PKG-INFO +4 -4
  2. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/README.md +1 -1
  3. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/pyproject.toml +3 -3
  4. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/cli_user_auth_interceptor.py +6 -2
  5. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/login.py +11 -4
  6. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/utils.py +4 -4
  7. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/app.py +17 -9
  8. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +6 -0
  9. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
  10. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/auth_plugin.py +33 -23
  11. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/constant.py +2 -0
  12. flwr_nightly-1.15.0.dev20250107/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py → flwr_nightly-1.15.0.dev20250112/src/py/flwr/common/grpc.py +51 -121
  13. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/typing.py +20 -0
  14. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.py +12 -24
  15. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.pyi +27 -54
  16. flwr_nightly-1.15.0.dev20250112/src/py/flwr/proto/fleet_pb2.py +69 -0
  17. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2.pyi +84 -0
  18. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.py +66 -0
  19. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.pyi +20 -0
  20. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/app.py +53 -33
  21. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +1 -1
  22. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +22 -8
  23. flwr_nightly-1.15.0.dev20250112/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +126 -0
  24. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
  25. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
  26. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +26 -22
  27. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate.py +10 -4
  28. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +50 -29
  29. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
  30. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_grpc.py +1 -1
  31. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_servicer.py +23 -2
  32. flwr_nightly-1.15.0.dev20250107/src/py/flwr/common/grpc.py +0 -68
  33. flwr_nightly-1.15.0.dev20250107/src/py/flwr/proto/fleet_pb2.py +0 -56
  34. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/LICENSE +0 -0
  35. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/__init__.py +0 -0
  36. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/__init__.py +0 -0
  37. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/app.py +0 -0
  38. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/build.py +0 -0
  39. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/config_utils.py +0 -0
  40. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/example.py +0 -0
  41. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/install.py +0 -0
  42. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/log.py +0 -0
  43. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/__init__.py +0 -0
  44. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/ls.py +0 -0
  45. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/__init__.py +0 -0
  46. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/new.py +0 -0
  47. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  48. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  54. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  56. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  67. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  83. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  84. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  85. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  86. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  87. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  88. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  89. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  90. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  91. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  92. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  93. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  94. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  95. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  96. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  97. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  98. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  99. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/__init__.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/run.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/stop.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/__init__.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client_app.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/__init__.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/app.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/utils.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/connection.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/heartbeat.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/__init__.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/__init__.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/comms_mods.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/utils.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/__init__.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/numpy_client.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/__init__.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/connection.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/run_info_store.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/__init__.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/app.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/typing.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/__init__.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/address.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/args.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/config.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/context.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/date.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/dp.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/exit_handlers.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/logger.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/message.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/object_ref.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/parameter.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/pyproject.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/__init__.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/configsrecord.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/conversion_utils.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/metricsrecord.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/parametersrecord.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/recordset.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/typeddict.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/recordset_compat.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/retry_invoker.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  168. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  170. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  172. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/serde.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/telemetry.py +0 -0
  174. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/version.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/__init__.py +0 -0
  176. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.py +0 -0
  223. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.pyi +0 -0
  224. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  228. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  230. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/py.typed +0 -0
  231. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/__init__.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_manager.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_proxy.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/__init__.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app_utils.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/legacy_context.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/criterion.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/__init__.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/driver.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/history.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/run_serverapp.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_app.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_config.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/__init__.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/app.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp_components.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/__init__.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/aggregate.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/bulyan.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadam.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedopt.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedprox.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/krum.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/strategy.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/utils.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/typing.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/tensorboard.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/validator.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/constant.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/app.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/legacy_app.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/run_simulation.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/__init__.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/app.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/deployment.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/executor.py +0 -0
  329. {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/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.15.0.dev20250107
3
+ Version: 1.15.0.dev20250112
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
43
43
  Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") 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
- Requires-Dist: starlette (>=0.31.0,<0.32.0) ; extra == "rest"
46
+ Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
47
47
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
48
48
  Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
49
49
  Requires-Dist: typer (>=0.12.5,<0.13.0)
50
- Requires-Dist: uvicorn[standard] (>=0.23.0,<0.24.0) ; extra == "rest"
50
+ Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
51
51
  Project-URL: Documentation, https://flower.ai
52
52
  Project-URL: Repository, https://github.com/adap/flower
53
53
  Description-Content-Type: text/markdown
@@ -88,7 +88,7 @@ design of Flower is based on a few guiding principles:
88
88
 
89
89
  - **Framework-agnostic**: Different machine learning frameworks have different
90
90
  strengths. Flower can be used with any machine learning framework, for
91
- example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
91
+ example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
92
92
  for users who enjoy computing gradients by hand.
93
93
 
94
94
  - **Understandable**: Flower is written with maintainability in mind. The
@@ -34,7 +34,7 @@ design of Flower is based on a few guiding principles:
34
34
 
35
35
  - **Framework-agnostic**: Different machine learning frameworks have different
36
36
  strengths. Flower can be used with any machine learning framework, for
37
- example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
37
+ example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
38
38
  for users who enjoy computing gradients by hand.
39
39
 
40
40
  - **Understandable**: Flower is written with maintainability in mind. The
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250107"
7
+ version = "1.15.0.dev20250112"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -83,8 +83,8 @@ requests = "^2.31.0"
83
83
  # Optional dependencies (Simulation Engine)
84
84
  ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
85
85
  # Optional dependencies (REST transport layer)
86
- starlette = { version = "^0.31.0", optional = true }
87
- uvicorn = { version = "^0.23.0", extras = ["standard"], optional = true }
86
+ starlette = { version = "^0.45.2", optional = true }
87
+ uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
88
88
 
89
89
  [tool.poetry.extras]
90
90
  simulation = ["ray"]
@@ -54,8 +54,12 @@ class CliUserAuthInterceptor(
54
54
 
55
55
  response = continuation(details, request)
56
56
  if response.initial_metadata():
57
- retrieved_metadata = dict(response.initial_metadata())
58
- self.auth_plugin.store_tokens(retrieved_metadata)
57
+ credentials = self.auth_plugin.read_tokens_from_metadata(
58
+ response.initial_metadata()
59
+ )
60
+ # The metadata contains tokens only if they have been refreshed
61
+ if credentials is not None:
62
+ self.auth_plugin.store_tokens(credentials)
59
63
 
60
64
  return response
61
65
 
@@ -26,7 +26,7 @@ from flwr.cli.config_utils import (
26
26
  process_loaded_project_config,
27
27
  validate_federation_in_project_config,
28
28
  )
29
- from flwr.common.constant import AUTH_TYPE
29
+ from flwr.common.typing import UserAuthLoginDetails
30
30
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
31
31
  GetLoginDetailsRequest,
32
32
  GetLoginDetailsResponse,
@@ -64,7 +64,7 @@ def login( # pylint: disable=R0914
64
64
  login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
65
65
 
66
66
  # Get the auth plugin
67
- auth_type = login_response.login_details.get(AUTH_TYPE)
67
+ auth_type = login_response.auth_type
68
68
  auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
69
69
  if auth_plugin is None:
70
70
  typer.secho(
@@ -75,7 +75,14 @@ def login( # pylint: disable=R0914
75
75
  raise typer.Exit(code=1)
76
76
 
77
77
  # Login
78
- auth_config = auth_plugin.login(dict(login_response.login_details), stub)
78
+ details = UserAuthLoginDetails(
79
+ auth_type=login_response.auth_type,
80
+ device_code=login_response.device_code,
81
+ verification_uri_complete=login_response.verification_uri_complete,
82
+ expires_in=login_response.expires_in,
83
+ interval=login_response.interval,
84
+ )
85
+ credentials = auth_plugin.login(details, stub)
79
86
 
80
87
  # Store the tokens
81
- auth_plugin.store_tokens(auth_config)
88
+ auth_plugin.store_tokens(credentials)
@@ -223,19 +223,19 @@ def try_obtain_cli_auth_plugin(
223
223
  config_path = get_user_auth_config_path(root_dir, federation)
224
224
 
225
225
  # Load the config file if it exists
226
- config: dict[str, Any] = {}
226
+ json_file: dict[str, Any] = {}
227
227
  if config_path.exists():
228
228
  with config_path.open("r", encoding="utf-8") as file:
229
- config = json.load(file)
229
+ json_file = json.load(file)
230
230
  # This is the case when the user auth is not enabled
231
231
  elif auth_type is None:
232
232
  return None
233
233
 
234
234
  # Get the auth type from the config if not provided
235
235
  if auth_type is None:
236
- if AUTH_TYPE not in config:
236
+ if AUTH_TYPE not in json_file:
237
237
  return None
238
- auth_type = config[AUTH_TYPE]
238
+ auth_type = json_file[AUTH_TYPE]
239
239
 
240
240
  # Retrieve auth plugin class and instantiate it
241
241
  try:
@@ -15,13 +15,14 @@
15
15
  """Flower client app."""
16
16
 
17
17
 
18
+ import multiprocessing
18
19
  import signal
19
- import subprocess
20
20
  import sys
21
21
  import time
22
22
  from contextlib import AbstractContextManager
23
23
  from dataclasses import dataclass
24
24
  from logging import ERROR, INFO, WARN
25
+ from os import urandom
25
26
  from pathlib import Path
26
27
  from typing import Callable, Optional, Union, cast
27
28
 
@@ -33,6 +34,7 @@ from flwr.cli.config_utils import get_fab_metadata
33
34
  from flwr.cli.install import install_from_fab
34
35
  from flwr.client.client import Client
35
36
  from flwr.client.client_app import ClientApp, LoadClientAppError
37
+ from flwr.client.clientapp.app import flwr_clientapp
36
38
  from flwr.client.nodestate.nodestate_factory import NodeStateFactory
37
39
  from flwr.client.typing import ClientFnExt
38
40
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
@@ -53,13 +55,12 @@ from flwr.common.constant import (
53
55
  TRANSPORT_TYPES,
54
56
  ErrorCode,
55
57
  )
58
+ from flwr.common.grpc import generic_create_grpc_server
56
59
  from flwr.common.logger import log, warn_deprecated_feature
57
60
  from flwr.common.message import Error
58
61
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
59
62
  from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
60
63
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
61
- from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
62
- from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
63
64
 
64
65
  from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
65
66
  from .grpc_adapter_client.connection import grpc_adapter
@@ -391,6 +392,7 @@ def start_client_internal(
391
392
  run_info_store: Optional[DeprecatedRunInfoStore] = None
392
393
  state_factory = NodeStateFactory()
393
394
  state = state_factory.state()
395
+ mp_spawn_context = multiprocessing.get_context("spawn")
394
396
 
395
397
  runs: dict[int, Run] = {}
396
398
 
@@ -513,7 +515,7 @@ def start_client_internal(
513
515
  # Docker container.
514
516
 
515
517
  # Generate SuperNode token
516
- token: int = generate_rand_int_from_bytes(RUN_ID_NUM_BYTES)
518
+ token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
517
519
 
518
520
  # Mode 1: SuperNode starts ClientApp as subprocess
519
521
  start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
@@ -549,12 +551,13 @@ def start_client_internal(
549
551
  ]
550
552
  command.append("--insecure")
551
553
 
552
- subprocess.run(
553
- command,
554
- stdout=None,
555
- stderr=None,
556
- check=True,
554
+ proc = mp_spawn_context.Process(
555
+ target=_run_flwr_clientapp,
556
+ args=(command,),
557
+ daemon=True,
557
558
  )
559
+ proc.start()
560
+ proc.join()
558
561
  else:
559
562
  # Wait for output to become available
560
563
  while not clientappio_servicer.has_outputs():
@@ -826,6 +829,11 @@ class _AppStateTracker:
826
829
  signal.signal(signal.SIGTERM, signal_handler)
827
830
 
828
831
 
832
+ def _run_flwr_clientapp(args: list[str]) -> None:
833
+ sys.argv = args
834
+ flwr_clientapp()
835
+
836
+
829
837
  def run_clientappio_api_grpc(
830
838
  address: str,
831
839
  certificates: Optional[tuple[bytes, bytes, bytes]],
@@ -36,7 +36,9 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
36
36
  CreateNodeRequest,
37
37
  DeleteNodeRequest,
38
38
  PingRequest,
39
+ PullMessagesRequest,
39
40
  PullTaskInsRequest,
41
+ PushMessagesRequest,
40
42
  PushTaskResRequest,
41
43
  )
42
44
  from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
@@ -52,6 +54,8 @@ Request = Union[
52
54
  GetRunRequest,
53
55
  PingRequest,
54
56
  GetFabRequest,
57
+ PullMessagesRequest,
58
+ PushMessagesRequest,
55
59
  ]
56
60
 
57
61
 
@@ -129,6 +133,8 @@ class AuthenticateClientInterceptor(grpc.UnaryUnaryClientInterceptor): # type:
129
133
  GetRunRequest,
130
134
  PingRequest,
131
135
  GetFabRequest,
136
+ PullMessagesRequest,
137
+ PushMessagesRequest,
132
138
  ),
133
139
  ):
134
140
  if self.shared_secret is None:
@@ -40,8 +40,12 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
40
40
  DeleteNodeResponse,
41
41
  PingRequest,
42
42
  PingResponse,
43
+ PullMessagesRequest,
44
+ PullMessagesResponse,
43
45
  PullTaskInsRequest,
44
46
  PullTaskInsResponse,
47
+ PushMessagesRequest,
48
+ PushMessagesResponse,
45
49
  PushTaskResRequest,
46
50
  PushTaskResResponse,
47
51
  )
@@ -132,12 +136,24 @@ class GrpcAdapter:
132
136
  """."""
133
137
  return self._send_and_receive(request, PullTaskInsResponse, **kwargs)
134
138
 
139
+ def PullMessages( # pylint: disable=C0103
140
+ self, request: PullMessagesRequest, **kwargs: Any
141
+ ) -> PullMessagesResponse:
142
+ """."""
143
+ return self._send_and_receive(request, PullMessagesResponse, **kwargs)
144
+
135
145
  def PushTaskRes( # pylint: disable=C0103
136
146
  self, request: PushTaskResRequest, **kwargs: Any
137
147
  ) -> PushTaskResResponse:
138
148
  """."""
139
149
  return self._send_and_receive(request, PushTaskResResponse, **kwargs)
140
150
 
151
+ def PushMessages( # pylint: disable=C0103
152
+ self, request: PushMessagesRequest, **kwargs: Any
153
+ ) -> PushMessagesResponse:
154
+ """."""
155
+ return self._send_and_receive(request, PushMessagesResponse, **kwargs)
156
+
141
157
  def GetRun( # pylint: disable=C0103
142
158
  self, request: GetRunRequest, **kwargs: Any
143
159
  ) -> GetRunResponse:
@@ -18,26 +18,31 @@
18
18
  from abc import ABC, abstractmethod
19
19
  from collections.abc import Sequence
20
20
  from pathlib import Path
21
- from typing import Any, Optional, Union
21
+ from typing import Optional, Union
22
22
 
23
23
  from flwr.proto.exec_pb2_grpc import ExecStub
24
24
 
25
+ from ..typing import UserAuthCredentials, UserAuthLoginDetails
26
+
25
27
 
26
28
  class ExecAuthPlugin(ABC):
27
29
  """Abstract Flower Auth Plugin class for ExecServicer.
28
30
 
29
31
  Parameters
30
32
  ----------
31
- config : dict[str, Any]
32
- The authentication configuration loaded from a YAML file.
33
+ user_auth_config_path : Path
34
+ Path to the YAML file containing the authentication configuration.
33
35
  """
34
36
 
35
37
  @abstractmethod
36
- def __init__(self, config: dict[str, Any]):
38
+ def __init__(
39
+ self,
40
+ user_auth_config_path: Path,
41
+ ):
37
42
  """Abstract constructor."""
38
43
 
39
44
  @abstractmethod
40
- def get_login_details(self) -> dict[str, str]:
45
+ def get_login_details(self) -> Optional[UserAuthLoginDetails]:
41
46
  """Get the login details."""
42
47
 
43
48
  @abstractmethod
@@ -47,7 +52,7 @@ class ExecAuthPlugin(ABC):
47
52
  """Validate authentication tokens in the provided metadata."""
48
53
 
49
54
  @abstractmethod
50
- def get_auth_tokens(self, auth_details: dict[str, str]) -> dict[str, str]:
55
+ def get_auth_tokens(self, device_code: str) -> Optional[UserAuthCredentials]:
51
56
  """Get authentication tokens."""
52
57
 
53
58
  @abstractmethod
@@ -62,50 +67,55 @@ class CliAuthPlugin(ABC):
62
67
 
63
68
  Parameters
64
69
  ----------
65
- user_auth_config_path : Path
66
- The path to the user's authentication configuration file.
70
+ credentials_path : Path
71
+ Path to the user's authentication credentials file.
67
72
  """
68
73
 
69
74
  @staticmethod
70
75
  @abstractmethod
71
76
  def login(
72
- login_details: dict[str, str],
77
+ login_details: UserAuthLoginDetails,
73
78
  exec_stub: ExecStub,
74
- ) -> dict[str, Any]:
75
- """Authenticate the user with the SuperLink.
79
+ ) -> UserAuthCredentials:
80
+ """Authenticate the user and retrieve authentication credentials.
76
81
 
77
82
  Parameters
78
83
  ----------
79
- login_details : dict[str, str]
80
- A dictionary containing the user's login details.
84
+ login_details : UserAuthLoginDetails
85
+ An object containing the user's login details.
81
86
  exec_stub : ExecStub
82
- An instance of `ExecStub` used for communication with the SuperLink.
87
+ A stub for executing RPC calls to the server.
83
88
 
84
89
  Returns
85
90
  -------
86
- user_auth_config : dict[str, Any]
87
- A dictionary containing the user's authentication configuration
88
- in JSON format.
91
+ UserAuthCredentials
92
+ The authentication credentials obtained after login.
89
93
  """
90
94
 
91
95
  @abstractmethod
92
- def __init__(self, user_auth_config_path: Path):
96
+ def __init__(self, credentials_path: Path):
93
97
  """Abstract constructor."""
94
98
 
95
99
  @abstractmethod
96
- def store_tokens(self, user_auth_config: dict[str, Any]) -> None:
97
- """Store authentication tokens from the provided user_auth_config.
100
+ def store_tokens(self, credentials: UserAuthCredentials) -> None:
101
+ """Store authentication tokens to the `credentials_path`.
98
102
 
99
- The configuration, including tokens, will be saved as a JSON file
100
- at `user_auth_config_path`.
103
+ The credentials, including tokens, will be saved as a JSON file
104
+ at `credentials_path`.
101
105
  """
102
106
 
103
107
  @abstractmethod
104
108
  def load_tokens(self) -> None:
105
- """Load authentication tokens from the user_auth_config_path."""
109
+ """Load authentication tokens from the `credentials_path`."""
106
110
 
107
111
  @abstractmethod
108
112
  def write_tokens_to_metadata(
109
113
  self, metadata: Sequence[tuple[str, Union[str, bytes]]]
110
114
  ) -> Sequence[tuple[str, Union[str, bytes]]]:
111
115
  """Write authentication tokens to the provided metadata."""
116
+
117
+ @abstractmethod
118
+ def read_tokens_from_metadata(
119
+ self, metadata: Sequence[tuple[str, Union[str, bytes]]]
120
+ ) -> Optional[UserAuthCredentials]:
121
+ """Read authentication tokens from the provided metadata."""
@@ -114,6 +114,8 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
114
114
  # Constants for user authentication
115
115
  CREDENTIALS_DIR = ".credentials"
116
116
  AUTH_TYPE = "auth_type"
117
+ ACCESS_TOKEN_KEY = "access_token"
118
+ REFRESH_TOKEN_KEY = "refresh_token"
117
119
 
118
120
 
119
121
  class MessageType:
@@ -1,4 +1,4 @@
1
- # Copyright 2024 Flower Labs GmbH. All Rights Reserved.
1
+ # Copyright 2022 Flower Labs GmbH. All Rights Reserved.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -12,32 +12,21 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  # ==============================================================================
15
- """Implements utility function to create a gRPC server."""
15
+ """Utility functions for gRPC."""
16
16
 
17
17
 
18
18
  import concurrent.futures
19
19
  import sys
20
20
  from collections.abc import Sequence
21
- from logging import ERROR
22
- from typing import Any, Callable, Optional, Union
21
+ from logging import DEBUG, ERROR
22
+ from typing import Any, Callable, Optional
23
23
 
24
24
  import grpc
25
25
 
26
- from flwr.common import GRPC_MAX_MESSAGE_LENGTH
27
- from flwr.common.address import is_port_in_use
28
- from flwr.common.logger import log
29
- from flwr.proto.transport_pb2_grpc import ( # pylint: disable=E0611
30
- add_FlowerServiceServicer_to_server,
31
- )
32
- from flwr.server.client_manager import ClientManager
33
- from flwr.server.superlink.driver.serverappio_servicer import ServerAppIoServicer
34
- from flwr.server.superlink.fleet.grpc_adapter.grpc_adapter_servicer import (
35
- GrpcAdapterServicer,
36
- )
37
- from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
38
- FlowerServiceServicer,
39
- )
40
- from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
26
+ from .address import is_port_in_use
27
+ from .logger import log
28
+
29
+ GRPC_MAX_MESSAGE_LENGTH: int = 536_870_912 # == 512 * 1024 * 1024
41
30
 
42
31
  INVALID_CERTIFICATES_ERR_MSG = """
43
32
  When setting any of root_certificate, certificate, or private_key,
@@ -47,122 +36,63 @@ INVALID_CERTIFICATES_ERR_MSG = """
47
36
  AddServicerToServerFn = Callable[..., Any]
48
37
 
49
38
 
50
- def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
51
- """Validate certificates tuple."""
52
- is_valid = (
53
- all(isinstance(certificate, bytes) for certificate in certificates)
54
- and len(certificates) == 3
55
- )
56
-
57
- if not is_valid:
58
- log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
59
-
60
- return is_valid
61
-
62
-
63
- def start_grpc_server( # pylint: disable=too-many-arguments,R0917
64
- client_manager: ClientManager,
39
+ def create_channel(
65
40
  server_address: str,
66
- max_concurrent_workers: int = 1000,
41
+ insecure: bool,
42
+ root_certificates: Optional[bytes] = None,
67
43
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
68
- keepalive_time_ms: int = 210000,
69
- certificates: Optional[tuple[bytes, bytes, bytes]] = None,
70
- ) -> grpc.Server:
71
- """Create and start a gRPC server running FlowerServiceServicer.
72
-
73
- If used in a main function server.wait_for_termination(timeout=None)
74
- should be called as otherwise the server will immediately stop.
75
-
76
- **SSL**
77
- To enable SSL you have to pass all of root_certificate, certificate,
78
- and private_key. Setting only some will make the process exit with code 1.
79
-
80
- Parameters
81
- ----------
82
- client_manager : ClientManager
83
- Instance of ClientManager
84
- server_address : str
85
- Server address in the form of HOST:PORT e.g. "[::]:8080"
86
- max_concurrent_workers : int
87
- Maximum number of clients the server can process before returning
88
- RESOURCE_EXHAUSTED status (default: 1000)
89
- max_message_length : int
90
- Maximum message length that the server can send or receive.
91
- Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
92
- keepalive_time_ms : int
93
- Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
94
- because some cloud providers (for example, Azure) agressively clean up idle
95
- TCP connections by terminating them after some time (4 minutes in the case
96
- of Azure). Flower does not use application-level keepalive signals and relies
97
- on the assumption that the transport layer will fail in cases where the
98
- connection is no longer active. `keepalive_time_ms` can be used to customize
99
- the keepalive interval for specific environments. The default Flower gRPC
100
- keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
101
- the long running streaming connection alive in most environments. The actual
102
- gRPC default of this setting is 7200000 (2 hours), which results in dropped
103
- connections in some cloud environments.
104
-
105
- These settings are related to the issue described here:
106
- - https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
107
- - https://github.com/grpc/grpc/blob/master/doc/keepalive.md
108
- - https://grpc.io/docs/guides/performance/
44
+ interceptors: Optional[Sequence[grpc.UnaryUnaryClientInterceptor]] = None,
45
+ ) -> grpc.Channel:
46
+ """Create a gRPC channel, either secure or insecure."""
47
+ # Check for conflicting parameters
48
+ if insecure and root_certificates is not None:
49
+ raise ValueError(
50
+ "Invalid configuration: 'root_certificates' should not be provided "
51
+ "when 'insecure' is set to True. For an insecure connection, omit "
52
+ "'root_certificates', or set 'insecure' to False for a secure connection."
53
+ )
109
54
 
110
- Mobile Flower clients may choose to increase this value if their server
111
- environment allows long-running idle TCP connections.
112
- (default: 210000)
113
- certificates : Tuple[bytes, bytes, bytes] (default: None)
114
- Tuple containing root certificate, server certificate, and private key to
115
- start a secure SSL-enabled server. The tuple is expected to have three bytes
116
- elements in the following order:
55
+ # Possible options:
56
+ # https://github.com/grpc/grpc/blob/v1.43.x/include/grpc/impl/codegen/grpc_types.h
57
+ channel_options = [
58
+ ("grpc.max_send_message_length", max_message_length),
59
+ ("grpc.max_receive_message_length", max_message_length),
60
+ ]
117
61
 
118
- * CA certificate.
119
- * server certificate.
120
- * server private key.
62
+ if insecure:
63
+ channel = grpc.insecure_channel(server_address, options=channel_options)
64
+ log(DEBUG, "Opened insecure gRPC connection (no certificates were passed)")
65
+ else:
66
+ try:
67
+ ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
68
+ except Exception as e:
69
+ raise ValueError(f"Failed to create SSL channel credentials: {e}") from e
70
+ channel = grpc.secure_channel(
71
+ server_address, ssl_channel_credentials, options=channel_options
72
+ )
73
+ log(DEBUG, "Opened secure gRPC connection using certificates")
121
74
 
122
- Returns
123
- -------
124
- server : grpc.Server
125
- An instance of a gRPC server which is already started
75
+ if interceptors is not None:
76
+ channel = grpc.intercept_channel(channel, interceptors)
126
77
 
127
- Examples
128
- --------
129
- Starting a SSL-enabled server.
78
+ return channel
130
79
 
131
- >>> from pathlib import Path
132
- >>> start_grpc_server(
133
- >>> client_manager=ClientManager(),
134
- >>> server_address="localhost:8080",
135
- >>> certificates=(
136
- >>> Path("/crts/root.pem").read_bytes(),
137
- >>> Path("/crts/localhost.crt").read_bytes(),
138
- >>> Path("/crts/localhost.key").read_bytes(),
139
- >>> ),
140
- >>> )
141
- """
142
- servicer = FlowerServiceServicer(client_manager)
143
- add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
144
80
 
145
- server = generic_create_grpc_server(
146
- servicer_and_add_fn=(servicer, add_servicer_to_server_fn),
147
- server_address=server_address,
148
- max_concurrent_workers=max_concurrent_workers,
149
- max_message_length=max_message_length,
150
- keepalive_time_ms=keepalive_time_ms,
151
- certificates=certificates,
81
+ def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
82
+ """Validate certificates tuple."""
83
+ is_valid = (
84
+ all(isinstance(certificate, bytes) for certificate in certificates)
85
+ and len(certificates) == 3
152
86
  )
153
87
 
154
- server.start()
88
+ if not is_valid:
89
+ log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
155
90
 
156
- return server
91
+ return is_valid
157
92
 
158
93
 
159
94
  def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
160
- servicer_and_add_fn: Union[
161
- tuple[FleetServicer, AddServicerToServerFn],
162
- tuple[GrpcAdapterServicer, AddServicerToServerFn],
163
- tuple[FlowerServiceServicer, AddServicerToServerFn],
164
- tuple[ServerAppIoServicer, AddServicerToServerFn],
165
- ],
95
+ servicer_and_add_fn: tuple[Any, AddServicerToServerFn],
166
96
  server_address: str,
167
97
  max_concurrent_workers: int = 1000,
168
98
  max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
@@ -266,3 +266,23 @@ class InvalidRunStatusException(BaseException):
266
266
  def __init__(self, message: str) -> None:
267
267
  super().__init__(message)
268
268
  self.message = message
269
+
270
+
271
+ # OIDC user authentication types
272
+ @dataclass
273
+ class UserAuthLoginDetails:
274
+ """User authentication login details."""
275
+
276
+ auth_type: str
277
+ device_code: str
278
+ verification_uri_complete: str
279
+ expires_in: int
280
+ interval: int
281
+
282
+
283
+ @dataclass
284
+ class UserAuthCredentials:
285
+ """User authentication tokens."""
286
+
287
+ access_token: str
288
+ refresh_token: str