flwr-nightly 1.14.0.dev20241215__tar.gz → 1.14.0.dev20241217__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (328) hide show
  1. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/PKG-INFO +1 -1
  2. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/pyproject.toml +1 -1
  3. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/log.py +9 -7
  4. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/login/login.py +1 -3
  5. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/ls.py +25 -22
  6. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/run/run.py +11 -18
  7. flwr_nightly-1.14.0.dev20241217/src/py/flwr/cli/stop.py +130 -0
  8. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/utils.py +26 -16
  9. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/app.py +11 -1
  10. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/client.py +0 -32
  11. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/app.py +3 -1
  12. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/connection.py +10 -4
  13. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/message_handler.py +0 -2
  14. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/numpy_client.py +0 -44
  15. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/logger.py +16 -1
  16. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/retry_invoker.py +3 -1
  17. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/app.py +7 -8
  18. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +9 -0
  19. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +1 -3
  20. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -2
  21. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +13 -0
  22. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/app.py +3 -2
  23. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/run_simulation.py +27 -21
  24. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/simulationio_connection.py +3 -0
  25. flwr_nightly-1.14.0.dev20241215/src/py/flwr/cli/stop.py +0 -91
  26. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/LICENSE +0 -0
  27. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/README.md +0 -0
  28. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/__init__.py +0 -0
  29. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/__init__.py +0 -0
  30. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/app.py +0 -0
  31. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/build.py +0 -0
  32. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  33. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/config_utils.py +0 -0
  34. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/example.py +0 -0
  35. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/install.py +0 -0
  36. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/login/__init__.py +0 -0
  37. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/__init__.py +0 -0
  38. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/new.py +0 -0
  39. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  40. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  41. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  42. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  43. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  44. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  45. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  46. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  47. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  48. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  49. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  50. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  51. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  52. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  53. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  54. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  55. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  56. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  57. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  58. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  59. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  60. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  61. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  62. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  63. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  64. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  66. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  67. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  68. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  69. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  70. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  71. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  72. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  73. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  74. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  75. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  76. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  77. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  78. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  79. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  80. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  81. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  82. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  83. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  84. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  85. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  86. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  87. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  88. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  89. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  90. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  91. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/cli/run/__init__.py +0 -0
  92. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/__init__.py +0 -0
  93. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/client_app.py +0 -0
  94. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/__init__.py +0 -0
  95. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  96. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/clientapp/utils.py +0 -0
  97. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  98. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  99. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  100. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  101. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_client/connection.py +0 -0
  102. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  103. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  104. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  105. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/heartbeat.py +0 -0
  106. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/__init__.py +0 -0
  107. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  108. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/__init__.py +0 -0
  109. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  110. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/comms_mods.py +0 -0
  111. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  112. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  113. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  114. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  115. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/mod/utils.py +0 -0
  116. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/__init__.py +0 -0
  117. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  118. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  119. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  120. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/rest_client/__init__.py +0 -0
  121. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/rest_client/connection.py +0 -0
  122. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/run_info_store.py +0 -0
  123. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/supernode/__init__.py +0 -0
  124. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/supernode/app.py +0 -0
  125. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/client/typing.py +0 -0
  126. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/__init__.py +0 -0
  127. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/address.py +0 -0
  128. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/args.py +0 -0
  129. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  130. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  131. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/config.py +0 -0
  132. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/constant.py +0 -0
  133. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/context.py +0 -0
  134. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/date.py +0 -0
  135. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/differential_privacy.py +0 -0
  136. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  137. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/dp.py +0 -0
  138. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/exit_handlers.py +0 -0
  139. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/grpc.py +0 -0
  140. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/message.py +0 -0
  141. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/object_ref.py +0 -0
  142. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/parameter.py +0 -0
  143. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/pyproject.py +0 -0
  144. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/__init__.py +0 -0
  145. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/configsrecord.py +0 -0
  146. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/conversion_utils.py +0 -0
  147. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/metricsrecord.py +0 -0
  148. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/parametersrecord.py +0 -0
  149. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/recordset.py +0 -0
  150. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/recordset_compat.py +0 -0
  152. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  153. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  154. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  155. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  156. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  157. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  158. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  159. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  160. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/serde.py +0 -0
  161. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/telemetry.py +0 -0
  162. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/typing.py +0 -0
  163. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/common/version.py +0 -0
  164. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/__init__.py +0 -0
  165. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  166. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  167. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2.py +0 -0
  170. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2.pyi +0 -0
  171. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2.py +0 -0
  174. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  175. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  176. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  177. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2.py +0 -0
  178. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  179. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  180. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  181. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2.py +0 -0
  182. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  183. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  184. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  185. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  186. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  187. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  188. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  189. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2.py +0 -0
  190. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2.pyi +0 -0
  191. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  192. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  193. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2.py +0 -0
  194. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2.pyi +0 -0
  195. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  196. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  197. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2.py +0 -0
  198. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2.pyi +0 -0
  199. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  200. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  201. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2.py +0 -0
  202. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  203. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  204. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  205. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2.py +0 -0
  206. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2.pyi +0 -0
  207. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  208. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  209. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  210. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  211. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  212. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  213. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  214. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  215. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  216. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  217. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2.py +0 -0
  218. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2.pyi +0 -0
  219. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  220. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  221. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2.py +0 -0
  222. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  223. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  224. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  225. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/py.typed +0 -0
  226. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/__init__.py +0 -0
  227. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/client_manager.py +0 -0
  228. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/client_proxy.py +0 -0
  229. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/__init__.py +0 -0
  230. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/app.py +0 -0
  231. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/app_utils.py +0 -0
  232. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  233. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/compat/legacy_context.py +0 -0
  234. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/criterion.py +0 -0
  235. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/__init__.py +0 -0
  236. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/driver.py +0 -0
  237. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  238. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  239. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/history.py +0 -0
  240. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/run_serverapp.py +0 -0
  241. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server.py +0 -0
  242. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server_app.py +0 -0
  243. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/server_config.py +0 -0
  244. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp/__init__.py +0 -0
  245. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp/app.py +0 -0
  246. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/serverapp_components.py +0 -0
  247. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/__init__.py +0 -0
  248. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/aggregate.py +0 -0
  249. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/bulyan.py +0 -0
  250. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  251. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  252. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  253. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  254. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  255. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  256. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedadam.py +0 -0
  257. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavg.py +0 -0
  258. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  259. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  260. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  261. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedopt.py +0 -0
  262. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedprox.py +0 -0
  263. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  264. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  265. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  266. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  267. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  268. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/krum.py +0 -0
  269. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  270. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/strategy/strategy.py +0 -0
  271. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/__init__.py +0 -0
  272. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  273. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  274. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  275. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  276. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  277. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  278. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  279. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  280. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  281. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  282. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  283. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  284. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  285. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  286. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  287. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  288. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  289. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  290. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  291. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  292. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  293. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  294. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  295. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  296. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  297. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  298. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  299. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  300. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  301. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  302. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  303. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  304. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/superlink/utils.py +0 -0
  305. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/typing.py +0 -0
  306. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/__init__.py +0 -0
  307. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/tensorboard.py +0 -0
  308. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/utils/validator.py +0 -0
  309. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/__init__.py +0 -0
  310. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/constant.py +0 -0
  311. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  312. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  313. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  314. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  315. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/__init__.py +0 -0
  316. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/legacy_app.py +0 -0
  317. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  318. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  319. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  320. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  321. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/__init__.py +0 -0
  322. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/app.py +0 -0
  323. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/deployment.py +0 -0
  324. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_grpc.py +0 -0
  325. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_servicer.py +0 -0
  326. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  327. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.14.0.dev20241215 → flwr_nightly-1.14.0.dev20241217}/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.14.0.dev20241215
3
+ Version: 1.14.0.dev20241217
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.14.0.dev20241215"
7
+ version = "1.14.0.dev20241217"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -34,7 +34,7 @@ from flwr.common.logger import log as logger
34
34
  from flwr.proto.exec_pb2 import StreamLogsRequest # pylint: disable=E0611
35
35
  from flwr.proto.exec_pb2_grpc import ExecStub
36
36
 
37
- from .utils import init_channel, try_obtain_cli_auth_plugin
37
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
38
 
39
39
 
40
40
  def start_stream(
@@ -88,8 +88,9 @@ def stream_logs(
88
88
  latest_timestamp = 0.0
89
89
  res = None
90
90
  try:
91
- for res in stub.StreamLogs(req, timeout=duration):
92
- print(res.log_output, end="")
91
+ with unauthenticated_exc_handler():
92
+ for res in stub.StreamLogs(req, timeout=duration):
93
+ print(res.log_output, end="")
93
94
  except grpc.RpcError as e:
94
95
  # pylint: disable=E1101
95
96
  if e.code() != grpc.StatusCode.DEADLINE_EXCEEDED:
@@ -109,9 +110,10 @@ def print_logs(run_id: int, channel: grpc.Channel, timeout: int) -> None:
109
110
  try:
110
111
  while True:
111
112
  try:
112
- # Enforce timeout for graceful exit
113
- for res in stub.StreamLogs(req, timeout=timeout):
114
- print(res.log_output)
113
+ with unauthenticated_exc_handler():
114
+ # Enforce timeout for graceful exit
115
+ for res in stub.StreamLogs(req, timeout=timeout):
116
+ print(res.log_output)
115
117
  except grpc.RpcError as e:
116
118
  # pylint: disable=E1101
117
119
  if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
@@ -170,7 +172,7 @@ def _log_with_exec_api(
170
172
  run_id: int,
171
173
  stream: bool,
172
174
  ) -> None:
173
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
175
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
174
176
  channel = init_channel(app, federation_config, auth_plugin)
175
177
 
176
178
  if stream:
@@ -65,9 +65,7 @@ def login( # pylint: disable=R0914
65
65
 
66
66
  # Get the auth plugin
67
67
  auth_type = login_response.login_details.get(AUTH_TYPE)
68
- auth_plugin = try_obtain_cli_auth_plugin(
69
- app, federation, federation_config, auth_type
70
- )
68
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
71
69
  if auth_plugin is None:
72
70
  typer.secho(
73
71
  f'❌ Authentication type "{auth_type}" not found',
@@ -19,13 +19,12 @@ import io
19
19
  import json
20
20
  from datetime import datetime, timedelta
21
21
  from pathlib import Path
22
- from typing import Annotated, Optional, Union
22
+ from typing import Annotated, Optional
23
23
 
24
24
  import typer
25
25
  from rich.console import Console
26
26
  from rich.table import Table
27
27
  from rich.text import Text
28
- from typer import Exit
29
28
 
30
29
  from flwr.cli.config_utils import (
31
30
  exit_if_no_address,
@@ -35,7 +34,7 @@ from flwr.cli.config_utils import (
35
34
  )
36
35
  from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
37
36
  from flwr.common.date import format_timedelta, isoformat8601_utc
38
- from flwr.common.logger import redirect_output, remove_emojis, restore_output
37
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
39
38
  from flwr.common.serde import run_from_proto
40
39
  from flwr.common.typing import Run
41
40
  from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
@@ -44,7 +43,7 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
44
43
  )
45
44
  from flwr.proto.exec_pb2_grpc import ExecStub
46
45
 
47
- from .utils import init_channel, try_obtain_cli_auth_plugin
46
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
48
47
 
49
48
  _RunListType = tuple[int, str, str, str, str, str, str, str, str]
50
49
 
@@ -81,13 +80,25 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
81
80
  ),
82
81
  ] = CliOutputFormat.DEFAULT,
83
82
  ) -> None:
84
- """List runs."""
83
+ """List the details of one provided run ID or all runs in a Flower federation.
84
+
85
+ The following details are displayed:
86
+
87
+ - **Run ID:** Unique identifier for the run.
88
+ - **FAB:** Name of the FAB associated with the run (``{FAB_ID} (v{FAB_VERSION})``).
89
+ - **Status:** Current status of the run (pending, starting, running, finished).
90
+ - **Elapsed:** Time elapsed since the run started (``HH:MM:SS``).
91
+ - **Created At:** Timestamp when the run was created.
92
+ - **Running At:** Timestamp when the run started running.
93
+ - **Finished At:** Timestamp when the run finished.
94
+
95
+ All timestamps follow ISO 8601, UTC and are formatted as ``YYYY-MM-DD HH:MM:SSZ``.
96
+ """
85
97
  suppress_output = output_format == CliOutputFormat.JSON
86
98
  captured_output = io.StringIO()
87
99
  try:
88
100
  if suppress_output:
89
101
  redirect_output(captured_output)
90
-
91
102
  # Load and validate federation config
92
103
  typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
93
104
 
@@ -104,7 +115,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
104
115
  raise ValueError(
105
116
  "The options '--runs' and '--run-id' are mutually exclusive."
106
117
  )
107
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
118
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
108
119
  channel = init_channel(app, federation_config, auth_plugin)
109
120
  stub = ExecStub(channel)
110
121
 
@@ -120,6 +131,8 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
120
131
  _list_runs(stub, output_format)
121
132
 
122
133
  except ValueError as err:
134
+ if suppress_output:
135
+ redirect_output(captured_output)
123
136
  typer.secho(
124
137
  f"❌ {err}",
125
138
  fg=typer.colors.RED,
@@ -132,7 +145,7 @@ def ls( # pylint: disable=too-many-locals, too-many-branches
132
145
  if suppress_output:
133
146
  restore_output()
134
147
  e_message = captured_output.getvalue()
135
- _print_json_error(e_message, err)
148
+ print_json_error(e_message, err)
136
149
  else:
137
150
  typer.secho(
138
151
  f"{err}",
@@ -283,7 +296,8 @@ def _list_runs(
283
296
  output_format: str = CliOutputFormat.DEFAULT,
284
297
  ) -> None:
285
298
  """List all runs."""
286
- res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
299
+ with unauthenticated_exc_handler():
300
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
287
301
  run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
288
302
 
289
303
  formatted_runs = _format_runs(run_dict, res.now)
@@ -299,7 +313,8 @@ def _display_one_run(
299
313
  output_format: str = CliOutputFormat.DEFAULT,
300
314
  ) -> None:
301
315
  """Display information about a specific run."""
302
- res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
316
+ with unauthenticated_exc_handler():
317
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
303
318
  if not res.run_dict:
304
319
  raise ValueError(f"Run ID {run_id} not found")
305
320
 
@@ -310,15 +325,3 @@ def _display_one_run(
310
325
  Console().print_json(_to_json(formatted_runs))
311
326
  else:
312
327
  Console().print(_to_table(formatted_runs))
313
-
314
-
315
- def _print_json_error(msg: str, e: Union[Exit, Exception]) -> None:
316
- """Print error message as JSON."""
317
- Console().print_json(
318
- json.dumps(
319
- {
320
- "success": False,
321
- "error-message": remove_emojis(str(msg) + "\n" + str(e)),
322
- }
323
- )
324
- )
@@ -19,7 +19,7 @@ import io
19
19
  import json
20
20
  import subprocess
21
21
  from pathlib import Path
22
- from typing import Annotated, Any, Optional, Union
22
+ from typing import Annotated, Any, Optional
23
23
 
24
24
  import typer
25
25
  from rich.console import Console
@@ -37,7 +37,7 @@ from flwr.common.config import (
37
37
  user_config_to_configsrecord,
38
38
  )
39
39
  from flwr.common.constant import CliOutputFormat
40
- from flwr.common.logger import redirect_output, remove_emojis, restore_output
40
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
41
41
  from flwr.common.serde import (
42
42
  configs_record_to_proto,
43
43
  fab_to_proto,
@@ -48,7 +48,11 @@ from flwr.proto.exec_pb2 import StartRunRequest # pylint: disable=E0611
48
48
  from flwr.proto.exec_pb2_grpc import ExecStub
49
49
 
50
50
  from ..log import start_stream
51
- from ..utils import init_channel, try_obtain_cli_auth_plugin
51
+ from ..utils import (
52
+ init_channel,
53
+ try_obtain_cli_auth_plugin,
54
+ unauthenticated_exc_handler,
55
+ )
52
56
 
53
57
  CONN_REFRESH_PERIOD = 60 # Connection refresh period for log streaming (seconds)
54
58
 
@@ -122,7 +126,7 @@ def run(
122
126
  if suppress_output:
123
127
  restore_output()
124
128
  e_message = captured_output.getvalue()
125
- _print_json_error(e_message, err)
129
+ print_json_error(e_message, err)
126
130
  else:
127
131
  typer.secho(
128
132
  f"{err}",
@@ -144,7 +148,7 @@ def _run_with_exec_api(
144
148
  stream: bool,
145
149
  output_format: str,
146
150
  ) -> None:
147
- auth_plugin = try_obtain_cli_auth_plugin(app, federation, federation_config)
151
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
148
152
  channel = init_channel(app, federation_config, auth_plugin)
149
153
  stub = ExecStub(channel)
150
154
 
@@ -166,7 +170,8 @@ def _run_with_exec_api(
166
170
  override_config=user_config_to_proto(parse_config_args(config_overrides)),
167
171
  federation_options=configs_record_to_proto(c_record),
168
172
  )
169
- res = stub.StartRun(req)
173
+ with unauthenticated_exc_handler():
174
+ res = stub.StartRun(req)
170
175
 
171
176
  if res.HasField("run_id"):
172
177
  typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
@@ -239,15 +244,3 @@ def _run_without_exec_api(
239
244
  check=True,
240
245
  text=True,
241
246
  )
242
-
243
-
244
- def _print_json_error(msg: str, e: Union[typer.Exit, Exception]) -> None:
245
- """Print error message as JSON."""
246
- Console().print_json(
247
- json.dumps(
248
- {
249
- "success": False,
250
- "error-message": remove_emojis(str(msg) + "\n" + str(e)),
251
- }
252
- )
253
- )
@@ -0,0 +1,130 @@
1
+ # Copyright 2024 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 command line interface `stop` command."""
16
+
17
+
18
+ import io
19
+ import json
20
+ from pathlib import Path
21
+ from typing import Annotated, Optional
22
+
23
+ import typer
24
+ from rich.console import Console
25
+
26
+ from flwr.cli.config_utils import (
27
+ exit_if_no_address,
28
+ load_and_validate,
29
+ process_loaded_project_config,
30
+ validate_federation_in_project_config,
31
+ )
32
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat
33
+ from flwr.common.logger import print_json_error, redirect_output, restore_output
34
+ from flwr.proto.exec_pb2 import StopRunRequest, StopRunResponse # pylint: disable=E0611
35
+ from flwr.proto.exec_pb2_grpc import ExecStub
36
+
37
+ from .utils import init_channel, try_obtain_cli_auth_plugin, unauthenticated_exc_handler
38
+
39
+
40
+ def stop( # pylint: disable=R0914
41
+ run_id: Annotated[ # pylint: disable=unused-argument
42
+ int,
43
+ typer.Argument(help="The Flower run ID to stop"),
44
+ ],
45
+ app: Annotated[
46
+ Path,
47
+ typer.Argument(help="Path of the Flower project"),
48
+ ] = Path("."),
49
+ federation: Annotated[
50
+ Optional[str],
51
+ typer.Argument(help="Name of the federation"),
52
+ ] = None,
53
+ output_format: Annotated[
54
+ str,
55
+ typer.Option(
56
+ "--format",
57
+ case_sensitive=False,
58
+ help="Format output using 'default' view or 'json'",
59
+ ),
60
+ ] = CliOutputFormat.DEFAULT,
61
+ ) -> None:
62
+ """Stop a run."""
63
+ suppress_output = output_format == CliOutputFormat.JSON
64
+ captured_output = io.StringIO()
65
+ try:
66
+ if suppress_output:
67
+ redirect_output(captured_output)
68
+
69
+ # Load and validate federation config
70
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
71
+
72
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
73
+ config, errors, warnings = load_and_validate(path=pyproject_path)
74
+ config = process_loaded_project_config(config, errors, warnings)
75
+ federation, federation_config = validate_federation_in_project_config(
76
+ federation, config
77
+ )
78
+ exit_if_no_address(federation_config, "stop")
79
+
80
+ try:
81
+ auth_plugin = try_obtain_cli_auth_plugin(app, federation)
82
+ channel = init_channel(app, federation_config, auth_plugin)
83
+ stub = ExecStub(channel) # pylint: disable=unused-variable # noqa: F841
84
+
85
+ typer.secho(f"✋ Stopping run ID {run_id}...", fg=typer.colors.GREEN)
86
+ _stop_run(stub=stub, run_id=run_id, output_format=output_format)
87
+
88
+ except ValueError as err:
89
+ typer.secho(
90
+ f"❌ {err}",
91
+ fg=typer.colors.RED,
92
+ bold=True,
93
+ )
94
+ raise typer.Exit(code=1) from err
95
+ finally:
96
+ channel.close()
97
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
98
+ if suppress_output:
99
+ restore_output()
100
+ e_message = captured_output.getvalue()
101
+ print_json_error(e_message, err)
102
+ else:
103
+ typer.secho(
104
+ f"{err}",
105
+ fg=typer.colors.RED,
106
+ bold=True,
107
+ )
108
+ finally:
109
+ if suppress_output:
110
+ restore_output()
111
+ captured_output.close()
112
+
113
+
114
+ def _stop_run(stub: ExecStub, run_id: int, output_format: str) -> None:
115
+ """Stop a run."""
116
+ with unauthenticated_exc_handler():
117
+ response: StopRunResponse = stub.StopRun(request=StopRunRequest(run_id=run_id))
118
+ if response.success:
119
+ typer.secho(f"✅ Run {run_id} successfully stopped.", fg=typer.colors.GREEN)
120
+ if output_format == CliOutputFormat.JSON:
121
+ run_output = json.dumps(
122
+ {
123
+ "success": True,
124
+ "run-id": run_id,
125
+ }
126
+ )
127
+ restore_output()
128
+ Console().print_json(run_output)
129
+ else:
130
+ typer.secho(f"❌ Run {run_id} couldn't be stopped.", fg=typer.colors.RED)
@@ -18,6 +18,8 @@
18
18
  import hashlib
19
19
  import json
20
20
  import re
21
+ from collections.abc import Iterator
22
+ from contextlib import contextmanager
21
23
  from logging import DEBUG
22
24
  from pathlib import Path
23
25
  from typing import Any, Callable, Optional, cast
@@ -26,7 +28,6 @@ import grpc
26
28
  import typer
27
29
 
28
30
  from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
29
- from flwr.common.address import parse_address
30
31
  from flwr.common.auth_plugin import CliAuthPlugin
31
32
  from flwr.common.constant import AUTH_TYPE, CREDENTIALS_DIR, FLWR_DIR
32
33
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
@@ -159,33 +160,21 @@ def get_sha256_hash(file_path: Path) -> str:
159
160
  return sha256.hexdigest()
160
161
 
161
162
 
162
- def get_user_auth_config_path(
163
- root_dir: Path, federation: str, server_address: str
164
- ) -> Path:
163
+ def get_user_auth_config_path(root_dir: Path, federation: str) -> Path:
165
164
  """Return the path to the user auth config file."""
166
- # Parse the server address
167
- parsed_addr = parse_address(server_address)
168
- if parsed_addr is None:
169
- raise ValueError(f"Invalid server address: {server_address}")
170
- host, port, is_v6 = parsed_addr
171
- formatted_addr = f"[{host}]_{port}" if is_v6 else f"{host}_{port}"
172
-
173
165
  # Locate the credentials directory
174
166
  credentials_dir = root_dir.absolute() / FLWR_DIR / CREDENTIALS_DIR
175
167
  credentials_dir.mkdir(parents=True, exist_ok=True)
176
- return credentials_dir / f"{federation}_{formatted_addr}.json"
168
+ return credentials_dir / f"{federation}.json"
177
169
 
178
170
 
179
171
  def try_obtain_cli_auth_plugin(
180
172
  root_dir: Path,
181
173
  federation: str,
182
- federation_config: dict[str, Any],
183
174
  auth_type: Optional[str] = None,
184
175
  ) -> Optional[CliAuthPlugin]:
185
176
  """Load the CLI-side user auth plugin for the given auth type."""
186
- config_path = get_user_auth_config_path(
187
- root_dir, federation, federation_config["address"]
188
- )
177
+ config_path = get_user_auth_config_path(root_dir, federation)
189
178
 
190
179
  # Load the config file if it exists
191
180
  config: dict[str, Any] = {}
@@ -244,3 +233,24 @@ def init_channel(
244
233
  )
245
234
  channel.subscribe(on_channel_state_change)
246
235
  return channel
236
+
237
+
238
+ @contextmanager
239
+ def unauthenticated_exc_handler() -> Iterator[None]:
240
+ """Context manager to handle gRPC UNAUTHENTICATED errors.
241
+
242
+ It catches grpc.RpcError exceptions with UNAUTHENTICATED status, informs the user,
243
+ and exits the application. All other exceptions will be allowed to escape.
244
+ """
245
+ try:
246
+ yield
247
+ except grpc.RpcError as e:
248
+ if e.code() != grpc.StatusCode.UNAUTHENTICATED:
249
+ raise
250
+ typer.secho(
251
+ "❌ Authentication failed. Please run `flwr login`"
252
+ " to authenticate and try again.",
253
+ fg=typer.colors.RED,
254
+ bold=True,
255
+ )
256
+ raise typer.Exit(code=1) from None
@@ -56,7 +56,7 @@ from flwr.common.constant import (
56
56
  from flwr.common.logger import log, warn_deprecated_feature
57
57
  from flwr.common.message import Error
58
58
  from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
59
- from flwr.common.typing import Fab, Run, UserConfig
59
+ from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
60
60
  from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
61
61
  from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
62
62
  from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
@@ -612,6 +612,16 @@ def start_client_internal(
612
612
  send(reply_message)
613
613
  log(INFO, "Sent reply")
614
614
 
615
+ except RunNotRunningException:
616
+ log(INFO, "")
617
+ log(
618
+ INFO,
619
+ "SuperNode aborted sending the reply message. "
620
+ "Run ID %s is not in `RUNNING` status.",
621
+ run_id,
622
+ )
623
+ log(INFO, "")
624
+
615
625
  except StopIteration:
616
626
  sleep_duration = 0
617
627
  break
@@ -22,7 +22,6 @@ from abc import ABC
22
22
 
23
23
  from flwr.common import (
24
24
  Code,
25
- Context,
26
25
  EvaluateIns,
27
26
  EvaluateRes,
28
27
  FitIns,
@@ -34,14 +33,11 @@ from flwr.common import (
34
33
  Parameters,
35
34
  Status,
36
35
  )
37
- from flwr.common.logger import warn_deprecated_feature_with_example
38
36
 
39
37
 
40
38
  class Client(ABC):
41
39
  """Abstract base class for Flower clients."""
42
40
 
43
- _context: Context
44
-
45
41
  def get_properties(self, ins: GetPropertiesIns) -> GetPropertiesRes:
46
42
  """Return set of client's properties.
47
43
 
@@ -143,34 +139,6 @@ class Client(ABC):
143
139
  metrics={},
144
140
  )
145
141
 
146
- @property
147
- def context(self) -> Context:
148
- """Getter for `Context` client attribute."""
149
- warn_deprecated_feature_with_example(
150
- "Accessing the context via the client's attribute is deprecated.",
151
- example_message="Instead, pass it to the client's "
152
- "constructor in your `client_fn()` which already "
153
- "receives a context object.",
154
- code_example="def client_fn(context: Context) -> Client:\n\n"
155
- "\t\t# Your existing client_fn\n\n"
156
- "\t\t# Pass `context` to the constructor\n"
157
- "\t\treturn FlowerClient(context).to_client()",
158
- )
159
- return self._context
160
-
161
- @context.setter
162
- def context(self, context: Context) -> None:
163
- """Setter for `Context` client attribute."""
164
- self._context = context
165
-
166
- def get_context(self) -> Context:
167
- """Get the run context from this client."""
168
- return self.context
169
-
170
- def set_context(self, context: Context) -> None:
171
- """Apply a run context to this client."""
172
- self.context = context
173
-
174
142
  def to_client(self) -> Client:
175
143
  """Return client (itself)."""
176
144
  return self
@@ -32,6 +32,7 @@ from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCo
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
35
+ from flwr.common.retry_invoker import _make_simple_grpc_retry_invoker, _wrap_stub
35
36
  from flwr.common.serde import (
36
37
  context_from_proto,
37
38
  context_to_proto,
@@ -106,9 +107,9 @@ def run_clientapp( # pylint: disable=R0914
106
107
 
107
108
  # Resolve directory where FABs are installed
108
109
  flwr_dir_ = get_flwr_dir(flwr_dir)
109
-
110
110
  try:
111
111
  stub = ClientAppIoStub(channel)
112
+ _wrap_stub(stub, _make_simple_grpc_retry_invoker())
112
113
 
113
114
  while True:
114
115
  # If token is not set, loop until token is received from SuperNode
@@ -139,6 +140,7 @@ def run_clientapp( # pylint: disable=R0914
139
140
 
140
141
  # Execute ClientApp
141
142
  reply_message = client_app(message=message, context=context)
143
+
142
144
  except Exception as ex: # pylint: disable=broad-exception-caught
143
145
  # Don't update/change NodeState
144
146
 
@@ -42,7 +42,7 @@ from flwr.common.logger import log
42
42
  from flwr.common.message import Message, Metadata
43
43
  from flwr.common.retry_invoker import RetryInvoker
44
44
  from flwr.common.serde import message_from_taskins, message_to_taskres, run_from_proto
45
- from flwr.common.typing import Fab, Run
45
+ from flwr.common.typing import Fab, Run, RunNotRunningException
46
46
  from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=E0611
47
47
  from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
48
48
  CreateNodeRequest,
@@ -155,10 +155,16 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
155
155
  ping_thread: Optional[threading.Thread] = None
156
156
  ping_stop_event = threading.Event()
157
157
 
158
+ def _should_giveup_fn(e: Exception) -> bool:
159
+ if e.code() == grpc.StatusCode.PERMISSION_DENIED: # type: ignore
160
+ raise RunNotRunningException
161
+ if e.code() == grpc.StatusCode.UNAVAILABLE: # type: ignore
162
+ return False
163
+ return True
164
+
158
165
  # Restrict retries to cases where the status code is UNAVAILABLE
159
- retry_invoker.should_giveup = (
160
- lambda e: e.code() != grpc.StatusCode.UNAVAILABLE # type: ignore
161
- )
166
+ # If the status code is PERMISSION_DENIED, additionally raise RunNotRunningException
167
+ retry_invoker.should_giveup = _should_giveup_fn
162
168
 
163
169
  ###########################################################################
164
170
  # ping/create_node/delete_node/receive/send/get_run functions
@@ -105,8 +105,6 @@ def handle_legacy_message_from_msgtype(
105
105
  "Please use `NumPyClient.to_client()` method to convert it to `Client`.",
106
106
  )
107
107
 
108
- client.set_context(context)
109
-
110
108
  message_type = message.metadata.message_type
111
109
 
112
110
  # Handle GetPropertiesIns