flwr-nightly 1.15.0.dev20250118__tar.gz → 1.15.0.dev20250119__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 (330) hide show
  1. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/pyproject.toml +1 -1
  3. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/app.py +7 -7
  4. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/clientapp/app.py +4 -6
  5. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/rest_client/connection.py +2 -3
  6. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/supernode/app.py +9 -15
  7. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/constant.py +0 -8
  8. flwr_nightly-1.15.0.dev20250119/src/py/flwr/common/exit/__init__.py +24 -0
  9. flwr_nightly-1.15.0.dev20250119/src/py/flwr/common/exit/exit.py +99 -0
  10. flwr_nightly-1.15.0.dev20250119/src/py/flwr/common/exit/exit_code.py +90 -0
  11. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/exit_handlers.py +24 -10
  12. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/app.py +9 -6
  13. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/serverapp/app.py +4 -6
  14. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -3
  15. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/LICENSE +0 -0
  16. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/README.md +0 -0
  17. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/__init__.py +0 -0
  18. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/__init__.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/app.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/build.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/config_utils.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/example.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/install.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/log.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/login/__init__.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/login/login.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/ls.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/__init__.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/new.py +0 -0
  31. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  32. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  33. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  34. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  35. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  36. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  37. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  38. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  39. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  40. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  51. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  83. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/run/__init__.py +0 -0
  84. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/run/run.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/stop.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/cli/utils.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/__init__.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/client.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/client_app.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/clientapp/__init__.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/clientapp/utils.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_client/connection.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/heartbeat.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/message_handler/__init__.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/__init__.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/comms_mods.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/mod/utils.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/nodestate/__init__.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/numpy_client.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/rest_client/__init__.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/run_info_store.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/supernode/__init__.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/client/typing.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/__init__.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/address.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/args.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/config.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/context.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/date.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/differential_privacy.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/dp.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/grpc.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/logger.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/message.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/object_ref.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/parameter.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/pyproject.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/__init__.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/configsrecord.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/conversion_utils.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/metricsrecord.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/parametersrecord.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/recordset.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/record/typeddict.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/recordset_compat.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/retry_invoker.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/serde.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/telemetry.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/typing.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/common/version.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/__init__.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  164. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  166. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/error_pb2.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/error_pb2.pyi +0 -0
  168. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  170. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/exec_pb2.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  172. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  174. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fab_pb2.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  176. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fleet_pb2.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/log_pb2.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/log_pb2.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/message_pb2.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/message_pb2.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/node_pb2.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/node_pb2.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/recordset_pb2.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/run_pb2.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/run_pb2.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/task_pb2.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/task_pb2.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/transport_pb2.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/py.typed +0 -0
  223. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/__init__.py +0 -0
  224. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/client_manager.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/client_proxy.py +0 -0
  226. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/compat/__init__.py +0 -0
  227. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/compat/app.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/compat/app_utils.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/compat/legacy_context.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/criterion.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/driver/__init__.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/driver/driver.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/history.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/run_serverapp.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/server.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/server_app.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/server_config.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/serverapp/__init__.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/serverapp_components.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/__init__.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/aggregate.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/bulyan.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedadam.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedavg.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedopt.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedprox.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/krum.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/strategy/strategy.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/__init__.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/superlink/utils.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/typing.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/utils/__init__.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/utils/tensorboard.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/utils/validator.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/__init__.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/constant.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/__init__.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/app.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/legacy_app.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/run_simulation.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/__init__.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/app.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/deployment.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/exec_grpc.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/exec_servicer.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  329. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/src/py/flwr/superexec/executor.py +0 -0
  330. {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250119}/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.dev20250119
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.dev20250119"
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 (
@@ -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
@@ -52,7 +52,6 @@ from flwr.common.constant import (
52
52
  FLEET_API_REST_DEFAULT_ADDRESS,
53
53
  ISOLATION_MODE_PROCESS,
54
54
  ISOLATION_MODE_SUBPROCESS,
55
- MISSING_EXTRA_REST,
56
55
  SERVER_OCTET,
57
56
  SERVERAPPIO_API_DEFAULT_SERVER_ADDRESS,
58
57
  SIMULATIONIO_API_DEFAULT_SERVER_ADDRESS,
@@ -60,6 +59,7 @@ from flwr.common.constant import (
60
59
  TRANSPORT_TYPE_GRPC_RERE,
61
60
  TRANSPORT_TYPE_REST,
62
61
  )
62
+ from flwr.common.exit import ExitCode, flwr_exit
63
63
  from flwr.common.exit_handlers import register_exit_handlers
64
64
  from flwr.common.grpc import generic_create_grpc_server
65
65
  from flwr.common.logger import log, warn_deprecated_feature
@@ -345,7 +345,7 @@ def run_superlink() -> None:
345
345
  and importlib.util.find_spec("starlette")
346
346
  and importlib.util.find_spec("uvicorn")
347
347
  ) is None:
348
- sys.exit(MISSING_EXTRA_REST)
348
+ flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
349
349
 
350
350
  _, ssl_certfile, ssl_keyfile = (
351
351
  certificates if certificates is not None else (None, None, None)
@@ -437,6 +437,7 @@ def run_superlink() -> None:
437
437
  # Graceful shutdown
438
438
  register_exit_handlers(
439
439
  event_type=EventType.RUN_SUPERLINK_LEAVE,
440
+ exit_message="SuperLink terminated gracefully.",
440
441
  grpc_servers=grpc_servers,
441
442
  )
442
443
 
@@ -445,7 +446,8 @@ def run_superlink() -> None:
445
446
  sleep(0.1)
446
447
 
447
448
  # Exit if any thread has exited prematurely
448
- sys.exit(1)
449
+ # This code will not be reached if the SuperLink stops gracefully
450
+ flwr_exit(ExitCode.SUPERLINK_THREAD_CRASH)
449
451
 
450
452
 
451
453
  def _run_flwr_command(args: list[str], main_pid: int) -> None:
@@ -520,8 +522,9 @@ def _flwr_scheduler(
520
522
  def _format_address(address: str) -> tuple[str, str, int]:
521
523
  parsed_address = parse_address(address)
522
524
  if not parsed_address:
523
- sys.exit(
524
- f"Address ({address}) cannot be parsed (expected: URL or IPv4 or IPv6)."
525
+ flwr_exit(
526
+ ExitCode.COMMON_ADDRESS_INVALID,
527
+ f"Address ({address}) cannot be parsed.",
525
528
  )
526
529
  host, port, is_v6 = parsed_address
527
530
  return (f"[{host}]:{port}" if is_v6 else f"{host}:{port}", host, port)
@@ -712,7 +715,7 @@ def _run_fleet_api_rest(
712
715
 
713
716
  from flwr.server.superlink.fleet.rest_rere.rest_api import app as fast_api_app
714
717
  except ModuleNotFoundError:
715
- sys.exit(MISSING_EXTRA_REST)
718
+ flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
716
719
 
717
720
  log(INFO, "Starting Flower REST server")
718
721
 
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
19
  from logging import DEBUG, ERROR, INFO
21
20
  from pathlib import Path
22
21
  from queue import Queue
@@ -38,6 +37,7 @@ from flwr.common.constant import (
38
37
  Status,
39
38
  SubStatus,
40
39
  )
40
+ from flwr.common.exit import ExitCode, flwr_exit
41
41
  from flwr.common.logger import (
42
42
  log,
43
43
  mirror_output_to_queue,
@@ -75,12 +75,10 @@ def flwr_serverapp() -> None:
75
75
  log(INFO, "Starting Flower ServerApp")
76
76
 
77
77
  if not args.insecure:
78
- log(
79
- ERROR,
80
- "`flwr-serverapp` does not support TLS yet. "
81
- "Please use the '--insecure' flag.",
78
+ flwr_exit(
79
+ ExitCode.COMMON_TLS_NOT_SUPPORTED,
80
+ "`flwr-serverapp` does not support TLS yet.",
82
81
  )
83
- sys.exit(1)
84
82
 
85
83
  log(
86
84
  DEBUG,
@@ -17,13 +17,12 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- import sys
21
20
  from collections.abc import Awaitable
22
21
  from typing import Callable, TypeVar, cast
23
22
 
24
23
  from google.protobuf.message import Message as GrpcMessage
25
24
 
26
- from flwr.common.constant import MISSING_EXTRA_REST
25
+ from flwr.common.exit import ExitCode, flwr_exit
27
26
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
28
27
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
29
28
  CreateNodeRequest,
@@ -55,7 +54,7 @@ try:
55
54
  from starlette.responses import Response
56
55
  from starlette.routing import Route
57
56
  except ModuleNotFoundError:
58
- sys.exit(MISSING_EXTRA_REST)
57
+ flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
59
58
 
60
59
 
61
60
  GrpcRequest = TypeVar("GrpcRequest", bound=GrpcMessage)