flwr-nightly 1.15.0.dev20250118__tar.gz → 1.15.0.dev20250120__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.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/pyproject.toml +1 -1
  3. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/app.py +7 -7
  4. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/app.py +4 -6
  5. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/rest_client/connection.py +2 -3
  6. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/supernode/app.py +9 -15
  7. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/auth_plugin/auth_plugin.py +1 -0
  8. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/constant.py +0 -8
  9. flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/__init__.py +24 -0
  10. flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/exit.py +99 -0
  11. flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/exit_code.py +90 -0
  12. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/exit_handlers.py +24 -10
  13. flwr_nightly-1.15.0.dev20250120/src/py/flwr/proto/serverappio_pb2.py +70 -0
  14. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2.pyi +56 -0
  15. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2_grpc.py +86 -0
  16. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +20 -0
  17. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/app.py +20 -9
  18. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp/app.py +4 -6
  19. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +109 -3
  20. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -3
  21. flwr_nightly-1.15.0.dev20250118/src/py/flwr/proto/serverappio_pb2.py +0 -62
  22. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/LICENSE +0 -0
  23. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/README.md +0 -0
  24. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/__init__.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/__init__.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/app.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/build.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/config_utils.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/example.py +0 -0
  31. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/install.py +0 -0
  32. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/log.py +0 -0
  33. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/login/__init__.py +0 -0
  34. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/login/login.py +0 -0
  35. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/ls.py +0 -0
  36. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/__init__.py +0 -0
  37. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/new.py +0 -0
  38. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  39. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  45. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  47. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  58. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  83. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  84. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  85. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  86. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  87. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  88. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  89. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  90. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/run/__init__.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/run/run.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/stop.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/utils.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/__init__.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/client.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/client_app.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/__init__.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/utils.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_client/connection.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/heartbeat.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/__init__.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/__init__.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/comms_mods.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/utils.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/__init__.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/numpy_client.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/rest_client/__init__.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/run_info_store.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/supernode/__init__.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/typing.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/__init__.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/address.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/args.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/config.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/context.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/date.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/differential_privacy.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/dp.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/grpc.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/logger.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/message.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/object_ref.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/parameter.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/pyproject.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/__init__.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/configsrecord.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/conversion_utils.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/metricsrecord.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/parametersrecord.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/recordset.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/typeddict.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/recordset_compat.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/retry_invoker.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/serde.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/telemetry.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/typing.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/version.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/__init__.py +0 -0
  168. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  170. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  172. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2.pyi +0 -0
  174. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  176. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  222. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  223. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  224. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/py.typed +0 -0
  225. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/__init__.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/client_manager.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/client_proxy.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/__init__.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/app.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/app_utils.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/legacy_context.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/criterion.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/__init__.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/driver.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/history.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/run_serverapp.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server_app.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server_config.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp/__init__.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp_components.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/__init__.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/aggregate.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/bulyan.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedadam.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavg.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedopt.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedprox.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/krum.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/strategy.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/__init__.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/utils.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/typing.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/__init__.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/tensorboard.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/validator.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/__init__.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/constant.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/app.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/legacy_app.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/run_simulation.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/__init__.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/app.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/deployment.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_grpc.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_servicer.py +0 -0
  329. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  330. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/executor.py +0 -0
  331. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/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.dev20250118
3
+ Version: 1.15.0.dev20250120
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.15.0.dev20250118"
7
+ version = "1.15.0.dev20250120"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -45,7 +45,6 @@ from flwr.common.constant import (
45
45
  ISOLATION_MODE_PROCESS,
46
46
  ISOLATION_MODE_SUBPROCESS,
47
47
  MAX_RETRY_DELAY,
48
- MISSING_EXTRA_REST,
49
48
  RUN_ID_NUM_BYTES,
50
49
  SERVER_OCTET,
51
50
  TRANSPORT_TYPE_GRPC_ADAPTER,
@@ -55,6 +54,7 @@ from flwr.common.constant import (
55
54
  TRANSPORT_TYPES,
56
55
  ErrorCode,
57
56
  )
57
+ from flwr.common.exit import ExitCode, flwr_exit
58
58
  from flwr.common.grpc import generic_create_grpc_server
59
59
  from flwr.common.logger import log, warn_deprecated_feature
60
60
  from flwr.common.message import Error
@@ -763,7 +763,10 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
763
763
  # Parse IP address
764
764
  parsed_address = parse_address(server_address)
765
765
  if not parsed_address:
766
- sys.exit(f"Server address ({server_address}) cannot be parsed.")
766
+ flwr_exit(
767
+ ExitCode.COMMON_ADDRESS_INVALID,
768
+ f"SuperLink address ({server_address}) cannot be parsed.",
769
+ )
767
770
  host, port, is_v6 = parsed_address
768
771
  address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
769
772
 
@@ -778,12 +781,9 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
778
781
 
779
782
  from .rest_client.connection import http_request_response
780
783
  except ModuleNotFoundError:
781
- sys.exit(MISSING_EXTRA_REST)
784
+ flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
782
785
  if server_address[:4] != "http":
783
- sys.exit(
784
- "When using the REST API, please provide `https://` or "
785
- "`http://` before the server address (e.g. `http://127.0.0.1:8080`)"
786
- )
786
+ flwr_exit(ExitCode.SUPERNODE_REST_ADDRESS_INVALID)
787
787
  connection, error_type = http_request_response, RequestsConnectionError
788
788
  elif transport == TRANSPORT_TYPE_GRPC_RERE:
789
789
  connection, error_type = grpc_request_response, RpcError
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
19
  import time
21
20
  from logging import DEBUG, ERROR, INFO
22
21
  from typing import Optional
@@ -29,6 +28,7 @@ from flwr.common import Context, Message
29
28
  from flwr.common.args import add_args_flwr_app_common
30
29
  from flwr.common.config import get_flwr_dir
31
30
  from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
31
+ from flwr.common.exit import ExitCode, flwr_exit
32
32
  from flwr.common.grpc import create_channel
33
33
  from flwr.common.logger import log
34
34
  from flwr.common.message import Error
@@ -61,12 +61,10 @@ def flwr_clientapp() -> None:
61
61
  """Run process-isolated Flower ClientApp."""
62
62
  args = _parse_args_run_flwr_clientapp().parse_args()
63
63
  if not args.insecure:
64
- log(
65
- ERROR,
66
- "flwr-clientapp does not support TLS yet. "
67
- "Please use the '--insecure' flag.",
64
+ flwr_exit(
65
+ ExitCode.COMMON_TLS_NOT_SUPPORTED,
66
+ "flwr-clientapp does not support TLS yet.",
68
67
  )
69
- sys.exit(1)
70
68
 
71
69
  log(INFO, "Starting Flower ClientApp")
72
70
  log(
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  import random
19
- import sys
20
19
  import threading
21
20
  from collections.abc import Iterator
22
21
  from contextlib import contextmanager
@@ -32,12 +31,12 @@ from flwr.client.heartbeat import start_ping_loop
32
31
  from flwr.client.message_handler.message_handler import validate_out_message
33
32
  from flwr.common import GRPC_MAX_MESSAGE_LENGTH
34
33
  from flwr.common.constant import (
35
- MISSING_EXTRA_REST,
36
34
  PING_BASE_MULTIPLIER,
37
35
  PING_CALL_TIMEOUT,
38
36
  PING_DEFAULT_INTERVAL,
39
37
  PING_RANDOM_RANGE,
40
38
  )
39
+ from flwr.common.exit import ExitCode, flwr_exit
41
40
  from flwr.common.logger import log
42
41
  from flwr.common.message import Message, Metadata
43
42
  from flwr.common.retry_invoker import RetryInvoker
@@ -62,7 +61,7 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
62
61
  try:
63
62
  import requests
64
63
  except ModuleNotFoundError:
65
- sys.exit(MISSING_EXTRA_REST)
64
+ flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
66
65
 
67
66
 
68
67
  PATH_CREATE_NODE: str = "api/v0/fleet/create-node"
@@ -40,6 +40,7 @@ from flwr.common.constant import (
40
40
  TRANSPORT_TYPE_GRPC_RERE,
41
41
  TRANSPORT_TYPE_REST,
42
42
  )
43
+ from flwr.common.exit import ExitCode, flwr_exit
43
44
  from flwr.common.exit_handlers import register_exit_handlers
44
45
  from flwr.common.logger import log, warn_deprecated_feature
45
46
 
@@ -89,6 +90,7 @@ def run_supernode() -> None:
89
90
  # Register handlers for graceful shutdown
90
91
  register_exit_handlers(
91
92
  event_type=EventType.RUN_SUPERNODE_LEAVE,
93
+ exit_message="SuperNode terminated gracefully.",
92
94
  )
93
95
 
94
96
  start_client_internal(
@@ -280,11 +282,7 @@ def _try_setup_client_authentication(
280
282
  return None
281
283
 
282
284
  if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
283
- sys.exit(
284
- "Authentication requires file paths to both "
285
- "'--auth-supernode-private-key' and '--auth-supernode-public-key'"
286
- "to be provided (providing only one of them is not sufficient)."
287
- )
285
+ flwr_exit(ExitCode.SUPERNODE_NODE_AUTH_KEYS_REQUIRED)
288
286
 
289
287
  try:
290
288
  ssh_private_key = load_ssh_private_key(
@@ -294,11 +292,9 @@ def _try_setup_client_authentication(
294
292
  if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
295
293
  raise ValueError()
296
294
  except (ValueError, UnsupportedAlgorithm):
297
- sys.exit(
298
- "Error: Unable to parse the private key file in "
299
- "'--auth-supernode-private-key'. Authentication requires elliptic "
300
- "curve private and public key pair. Please ensure that the file "
301
- "path points to a valid private key file and try again."
295
+ flwr_exit(
296
+ ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID,
297
+ "Unable to parse the private key file.",
302
298
  )
303
299
 
304
300
  try:
@@ -308,11 +304,9 @@ def _try_setup_client_authentication(
308
304
  if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
309
305
  raise ValueError()
310
306
  except (ValueError, UnsupportedAlgorithm):
311
- sys.exit(
312
- "Error: Unable to parse the public key file in "
313
- "'--auth-supernode-public-key'. Authentication requires elliptic "
314
- "curve private and public key pair. Please ensure that the file "
315
- "path points to a valid public key file and try again."
307
+ flwr_exit(
308
+ ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID,
309
+ "Unable to parse the public key file.",
316
310
  )
317
311
 
318
312
  return (
@@ -38,6 +38,7 @@ class ExecAuthPlugin(ABC):
38
38
  def __init__(
39
39
  self,
40
40
  user_auth_config_path: Path,
41
+ verify_tls_cert: bool,
41
42
  ):
42
43
  """Abstract constructor."""
43
44
 
@@ -17,14 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- MISSING_EXTRA_REST = """
21
- Extra dependencies required for using the REST-based Fleet API are missing.
22
-
23
- To use the REST API, install `flwr` with the `rest` extra:
24
-
25
- `pip install flwr[rest]`.
26
- """
27
-
28
20
  TRANSPORT_TYPE_GRPC_BIDI = "grpc-bidi"
29
21
  TRANSPORT_TYPE_GRPC_RERE = "grpc-rere"
30
22
  TRANSPORT_TYPE_GRPC_ADAPTER = "grpc-adapter"
@@ -0,0 +1,24 @@
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 exit functionality."""
16
+
17
+
18
+ from .exit import flwr_exit
19
+ from .exit_code import ExitCode
20
+
21
+ __all__ = [
22
+ "ExitCode",
23
+ "flwr_exit",
24
+ ]
@@ -0,0 +1,99 @@
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
+ """Unified exit function."""
16
+
17
+
18
+ from __future__ import annotations
19
+
20
+ import sys
21
+ from logging import ERROR, INFO
22
+ from typing import Any, NoReturn
23
+
24
+ from flwr.common import EventType, event
25
+
26
+ from ..logger import log
27
+ from .exit_code import EXIT_CODE_HELP
28
+
29
+ HELP_PAGE_URL = "https://flower.ai/docs/framework/ref-exit-codes/"
30
+
31
+
32
+ def flwr_exit(
33
+ code: int,
34
+ message: str | None = None,
35
+ event_type: EventType | None = None,
36
+ event_details: dict[str, Any] | None = None,
37
+ ) -> NoReturn:
38
+ """Handle application exit with an optional message.
39
+
40
+ The exit message logged and displayed will follow this structure:
41
+
42
+ >>> Exit Code: <code>
43
+ >>> <message>
44
+ >>> <short-help-message>
45
+ >>>
46
+ >>> For more information, visit: <help-page-url>
47
+
48
+ - `<code>`: The unique exit code representing the termination reason.
49
+ - `<message>`: Optional context or additional information about the exit.
50
+ - `<short-help-message>`: A brief explanation for the given exit code.
51
+ - `<help-page-url>`: A URL providing detailed documentation and resolution steps.
52
+ """
53
+ is_error = not 0 <= code < 100 # 0-99 are success exit codes
54
+
55
+ # Construct exit message
56
+ exit_message = f"Exit Code: {code}\n" if is_error else ""
57
+ exit_message += message or ""
58
+ if short_help_message := EXIT_CODE_HELP.get(code, ""):
59
+ exit_message += f"\n{short_help_message}"
60
+
61
+ # Set log level and system exit code
62
+ log_level = ERROR if is_error else INFO
63
+ sys_exit_code = 1 if is_error else 0
64
+
65
+ # Add help URL for non-successful/graceful exits
66
+ if is_error:
67
+ help_url = f"{HELP_PAGE_URL}{code}.html"
68
+ exit_message += f"\n\nFor more information, visit: <{help_url}>"
69
+
70
+ # Telemetry event
71
+ event_type = event_type or _try_obtain_telemetry_event()
72
+ if event_type:
73
+ event_details = event_details or {}
74
+ event_details["exit_code"] = code
75
+ event(event_type, event_details).result()
76
+
77
+ # Log the exit message
78
+ log(log_level, exit_message)
79
+
80
+ # Exit
81
+ sys.exit(sys_exit_code)
82
+
83
+
84
+ # pylint: disable-next=too-many-return-statements
85
+ def _try_obtain_telemetry_event() -> EventType | None:
86
+ """Try to obtain a telemetry event."""
87
+ if sys.argv[0].endswith("flower-superlink"):
88
+ return EventType.RUN_SUPERLINK_LEAVE
89
+ if sys.argv[0].endswith("flower-supernode"):
90
+ return EventType.RUN_SUPERNODE_LEAVE
91
+ if sys.argv[0].endswith("flwr-serverapp"):
92
+ return EventType.FLWR_SERVERAPP_RUN_LEAVE
93
+ if sys.argv[0].endswith("flwr-clientapp"):
94
+ return None # Not yet implemented
95
+ if sys.argv[0].endswith("flwr-simulation"):
96
+ return EventType.FLWR_SIMULATION_RUN_LEAVE
97
+ if sys.argv[0].endswith("flower-simulation"):
98
+ return EventType.CLI_FLOWER_SIMULATION_LEAVE
99
+ return None
@@ -0,0 +1,90 @@
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
+ """Exit codes."""
16
+
17
+
18
+ from __future__ import annotations
19
+
20
+
21
+ class ExitCode:
22
+ """Exit codes for Flower components."""
23
+
24
+ # Success exit codes (0-99)
25
+ SUCCESS = 0 # Successful exit without any errors or signals
26
+ GRACEFUL_EXIT_SIGINT = 1 # Graceful exit triggered by SIGINT
27
+ GRACEFUL_EXIT_SIGQUIT = 2 # Graceful exit triggered by SIGQUIT
28
+ GRACEFUL_EXIT_SIGTERM = 3 # Graceful exit triggered by SIGTERM
29
+
30
+ # SuperLink-specific exit codes (100-199)
31
+ SUPERLINK_THREAD_CRASH = 100
32
+
33
+ # ServerApp-specific exit codes (200-299)
34
+
35
+ # SuperNode-specific exit codes (300-399)
36
+ SUPERNODE_REST_ADDRESS_INVALID = 300
37
+ SUPERNODE_NODE_AUTH_KEYS_REQUIRED = 301
38
+ SUPERNODE_NODE_AUTH_KEYS_INVALID = 302
39
+
40
+ # ClientApp-specific exit codes (400-499)
41
+
42
+ # Common exit codes (500-)
43
+ COMMON_ADDRESS_INVALID = 500
44
+ COMMON_MISSING_EXTRA_REST = 501
45
+ COMMON_TLS_NOT_SUPPORTED = 502
46
+
47
+ def __new__(cls) -> ExitCode:
48
+ """Prevent instantiation."""
49
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
50
+
51
+
52
+ # All short help messages for exit codes
53
+ EXIT_CODE_HELP = {
54
+ # Success exit codes (0-99)
55
+ ExitCode.SUCCESS: "",
56
+ ExitCode.GRACEFUL_EXIT_SIGINT: "",
57
+ ExitCode.GRACEFUL_EXIT_SIGQUIT: "",
58
+ ExitCode.GRACEFUL_EXIT_SIGTERM: "",
59
+ # SuperLink-specific exit codes (100-199)
60
+ ExitCode.SUPERLINK_THREAD_CRASH: "An important background thread has crashed.",
61
+ # ServerApp-specific exit codes (200-299)
62
+ # SuperNode-specific exit codes (300-399)
63
+ ExitCode.SUPERNODE_REST_ADDRESS_INVALID: (
64
+ "When using the REST API, please provide `https://` or "
65
+ "`http://` before the server address (e.g. `http://127.0.0.1:8080`)"
66
+ ),
67
+ ExitCode.SUPERNODE_NODE_AUTH_KEYS_REQUIRED: (
68
+ "Node authentication requires file paths to both "
69
+ "'--auth-supernode-private-key' and '--auth-supernode-public-key' "
70
+ "to be provided (providing only one of them is not sufficient)."
71
+ ),
72
+ ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID: (
73
+ "Node uthentication requires elliptic curve private and public key pair. "
74
+ "Please ensure that the file path points to a valid private/public key "
75
+ "file and try again."
76
+ ),
77
+ # ClientApp-specific exit codes (400-499)
78
+ # Common exit codes (500-)
79
+ ExitCode.COMMON_ADDRESS_INVALID: (
80
+ "Please provide a valid URL, IPv4 or IPv6 address."
81
+ ),
82
+ ExitCode.COMMON_MISSING_EXTRA_REST: """
83
+ Extra dependencies required for using the REST-based Fleet API are missing.
84
+
85
+ To use the REST API, install `flwr` with the `rest` extra:
86
+
87
+ `pip install "flwr[rest]"`.
88
+ """,
89
+ ExitCode.COMMON_TLS_NOT_SUPPORTED: "Please use the '--insecure' flag.",
90
+ }
@@ -15,28 +15,38 @@
15
15
  """Common function to register exit handlers for server and client."""
16
16
 
17
17
 
18
- import sys
19
- from signal import SIGINT, SIGTERM, signal
18
+ from signal import SIGINT, SIGQUIT, SIGTERM, signal
20
19
  from threading import Thread
21
20
  from types import FrameType
22
21
  from typing import Optional
23
22
 
24
23
  from grpc import Server
25
24
 
26
- from flwr.common.telemetry import EventType, event
25
+ from flwr.common.telemetry import EventType
26
+
27
+ from .exit import ExitCode, flwr_exit
28
+
29
+ SIGNAL_TO_EXIT_CODE = {
30
+ SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
31
+ SIGQUIT: ExitCode.GRACEFUL_EXIT_SIGQUIT,
32
+ SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
33
+ }
27
34
 
28
35
 
29
36
  def register_exit_handlers(
30
37
  event_type: EventType,
38
+ exit_message: Optional[str] = None,
31
39
  grpc_servers: Optional[list[Server]] = None,
32
40
  bckg_threads: Optional[list[Thread]] = None,
33
41
  ) -> None:
34
- """Register exit handlers for `SIGINT` and `SIGTERM` signals.
42
+ """Register exit handlers for `SIGINT`, `SIGTERM` and `SIGQUIT` signals.
35
43
 
36
44
  Parameters
37
45
  ----------
38
46
  event_type : EventType
39
47
  The telemetry event that should be logged before exit.
48
+ exit_message : Optional[str] (default: None)
49
+ The message to be logged before exiting.
40
50
  grpc_servers: Optional[List[Server]] (default: None)
41
51
  An otpional list of gRPC servers that need to be gracefully
42
52
  terminated before exiting.
@@ -46,6 +56,7 @@ def register_exit_handlers(
46
56
  """
47
57
  default_handlers = {
48
58
  SIGINT: None,
59
+ SIGQUIT: None,
49
60
  SIGTERM: None,
50
61
  }
51
62
 
@@ -61,8 +72,6 @@ def register_exit_handlers(
61
72
  # Reset to default handler
62
73
  signal(signalnum, default_handlers[signalnum])
63
74
 
64
- event_res = event(event_type=event_type)
65
-
66
75
  if grpc_servers is not None:
67
76
  for grpc_server in grpc_servers:
68
77
  grpc_server.stop(grace=1)
@@ -71,16 +80,21 @@ def register_exit_handlers(
71
80
  for bckg_thread in bckg_threads:
72
81
  bckg_thread.join()
73
82
 
74
- # Ensure event has happend
75
- event_res.result()
76
-
77
83
  # Setup things for graceful exit
78
- sys.exit(0)
84
+ flwr_exit(
85
+ code=SIGNAL_TO_EXIT_CODE[signalnum],
86
+ message=exit_message,
87
+ event_type=event_type,
88
+ )
79
89
 
80
90
  default_handlers[SIGINT] = signal( # type: ignore
81
91
  SIGINT,
82
92
  graceful_exit_handler, # type: ignore
83
93
  )
94
+ default_handlers[SIGQUIT] = signal( # type: ignore
95
+ SIGQUIT,
96
+ graceful_exit_handler, # type: ignore
97
+ )
84
98
  default_handlers[SIGTERM] = signal( # type: ignore
85
99
  SIGTERM,
86
100
  graceful_exit_handler, # type: ignore
@@ -0,0 +1,70 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: flwr/proto/serverappio.proto
5
+ # Protobuf Python Version: 5.29.0
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 0,
17
+ '',
18
+ 'flwr/proto/serverappio.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+ from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
26
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
27
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
28
+ from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
29
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
30
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
31
+
32
+
33
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"P\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"V\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"T\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"E\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xd5\x08\n\x0bServerAppIo\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x62\x06proto3')
34
+
35
+ _globals = globals()
36
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
37
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.serverappio_pb2', _globals)
38
+ if not _descriptor._USE_C_DESCRIPTORS:
39
+ DESCRIPTOR._loaded_options = None
40
+ _globals['_GETNODESREQUEST']._serialized_start=182
41
+ _globals['_GETNODESREQUEST']._serialized_end=215
42
+ _globals['_GETNODESRESPONSE']._serialized_start=217
43
+ _globals['_GETNODESRESPONSE']._serialized_end=268
44
+ _globals['_PUSHTASKINSREQUEST']._serialized_start=270
45
+ _globals['_PUSHTASKINSREQUEST']._serialized_end=350
46
+ _globals['_PUSHTASKINSRESPONSE']._serialized_start=352
47
+ _globals['_PUSHTASKINSRESPONSE']._serialized_end=391
48
+ _globals['_PULLTASKRESREQUEST']._serialized_start=393
49
+ _globals['_PULLTASKRESREQUEST']._serialized_end=479
50
+ _globals['_PULLTASKRESRESPONSE']._serialized_start=481
51
+ _globals['_PULLTASKRESRESPONSE']._serialized_end=546
52
+ _globals['_PUSHINSMESSAGESREQUEST']._serialized_start=548
53
+ _globals['_PUSHINSMESSAGESREQUEST']._serialized_end=632
54
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=634
55
+ _globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=680
56
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_start=682
57
+ _globals['_PULLRESMESSAGESREQUEST']._serialized_end=743
58
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_start=745
59
+ _globals['_PULLRESMESSAGESRESPONSE']._serialized_end=814
60
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=816
61
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=844
62
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=846
63
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=973
64
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=975
65
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=1058
66
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=1060
67
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=1090
68
+ _globals['_SERVERAPPIO']._serialized_start=1093
69
+ _globals['_SERVERAPPIO']._serialized_end=2202
70
+ # @@protoc_insertion_point(module_scope)
@@ -101,6 +101,62 @@ class PullTaskResResponse(google.protobuf.message.Message):
101
101
  def ClearField(self, field_name: typing_extensions.Literal["task_res_list",b"task_res_list"]) -> None: ...
102
102
  global___PullTaskResResponse = PullTaskResResponse
103
103
 
104
+ class PushInsMessagesRequest(google.protobuf.message.Message):
105
+ """PushMessages messages"""
106
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
107
+ MESSAGES_LIST_FIELD_NUMBER: builtins.int
108
+ RUN_ID_FIELD_NUMBER: builtins.int
109
+ @property
110
+ def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
111
+ run_id: builtins.int
112
+ def __init__(self,
113
+ *,
114
+ messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
115
+ run_id: builtins.int = ...,
116
+ ) -> None: ...
117
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","run_id",b"run_id"]) -> None: ...
118
+ global___PushInsMessagesRequest = PushInsMessagesRequest
119
+
120
+ class PushInsMessagesResponse(google.protobuf.message.Message):
121
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
122
+ MESSAGE_IDS_FIELD_NUMBER: builtins.int
123
+ @property
124
+ def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
125
+ def __init__(self,
126
+ *,
127
+ message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
128
+ ) -> None: ...
129
+ def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids"]) -> None: ...
130
+ global___PushInsMessagesResponse = PushInsMessagesResponse
131
+
132
+ class PullResMessagesRequest(google.protobuf.message.Message):
133
+ """PullMessages messages"""
134
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
135
+ MESSAGE_IDS_FIELD_NUMBER: builtins.int
136
+ RUN_ID_FIELD_NUMBER: builtins.int
137
+ @property
138
+ def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
139
+ run_id: builtins.int
140
+ def __init__(self,
141
+ *,
142
+ message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
143
+ run_id: builtins.int = ...,
144
+ ) -> None: ...
145
+ def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","run_id",b"run_id"]) -> None: ...
146
+ global___PullResMessagesRequest = PullResMessagesRequest
147
+
148
+ class PullResMessagesResponse(google.protobuf.message.Message):
149
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
150
+ MESSAGES_LIST_FIELD_NUMBER: builtins.int
151
+ @property
152
+ def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
153
+ def __init__(self,
154
+ *,
155
+ messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
156
+ ) -> None: ...
157
+ def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list"]) -> None: ...
158
+ global___PullResMessagesResponse = PullResMessagesResponse
159
+
104
160
  class PullServerAppInputsRequest(google.protobuf.message.Message):
105
161
  """PullServerAppInputs messages"""
106
162
  DESCRIPTOR: google.protobuf.descriptor.Descriptor