flwr-nightly 1.14.0.dev20241127__tar.gz → 1.14.0.dev20241204__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.dev20241127 → flwr_nightly-1.14.0.dev20241204}/PKG-INFO +1 -1
  2. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/pyproject.toml +1 -1
  3. flwr_nightly-1.14.0.dev20241204/src/py/flwr/cli/ls.py +354 -0
  4. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/run/run.py +81 -14
  5. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/constant.py +11 -0
  6. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/logger.py +25 -1
  7. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/exec_pb2.py +14 -14
  8. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/exec_pb2.pyi +4 -2
  9. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/app.py +1 -1
  10. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +1 -1
  11. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +12 -11
  12. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -3
  13. flwr_nightly-1.14.0.dev20241127/src/py/flwr/cli/ls.py +0 -228
  14. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/common_pb2.py +0 -36
  15. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/common_pb2.pyi +0 -121
  16. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/common_pb2_grpc.py +0 -4
  17. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/common_pb2_grpc.pyi +0 -4
  18. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/control_pb2.py +0 -27
  19. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/control_pb2.pyi +0 -7
  20. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/control_pb2_grpc.py +0 -135
  21. flwr_nightly-1.14.0.dev20241127/src/py/flwr/proto/control_pb2_grpc.pyi +0 -53
  22. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/LICENSE +0 -0
  23. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/README.md +0 -0
  24. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/__init__.py +0 -0
  25. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/__init__.py +0 -0
  26. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/app.py +0 -0
  27. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/build.py +0 -0
  28. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/config_utils.py +0 -0
  29. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/example.py +0 -0
  30. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/install.py +0 -0
  31. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/log.py +0 -0
  32. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/__init__.py +0 -0
  33. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/new.py +0 -0
  34. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  35. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  36. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  37. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  38. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  39. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  40. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  41. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  42. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  43. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  44. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  45. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  46. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  47. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  48. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  49. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  50. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  51. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  52. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  53. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  54. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  55. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  56. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  57. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  58. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  59. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  60. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  61. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  62. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  63. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  64. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  65. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  66. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  67. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  68. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  69. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  70. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  71. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  72. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  73. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  74. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  75. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  76. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  77. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  78. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  79. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  80. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  81. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  82. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  83. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  84. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  85. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  86. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/run/__init__.py +0 -0
  87. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/cli/utils.py +0 -0
  88. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/__init__.py +0 -0
  89. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/app.py +0 -0
  90. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/client.py +0 -0
  91. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/client_app.py +0 -0
  92. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/clientapp/__init__.py +0 -0
  93. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/clientapp/app.py +0 -0
  94. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  95. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/clientapp/utils.py +0 -0
  96. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  97. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  98. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  99. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  100. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_client/connection.py +0 -0
  101. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  102. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  103. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  104. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  105. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/heartbeat.py +0 -0
  106. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/message_handler/__init__.py +0 -0
  107. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  108. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  109. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/__init__.py +0 -0
  110. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  111. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/comms_mods.py +0 -0
  112. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  113. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  114. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  115. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  116. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/mod/utils.py +0 -0
  117. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/nodestate/__init__.py +0 -0
  118. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  119. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  120. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  121. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/numpy_client.py +0 -0
  122. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/rest_client/__init__.py +0 -0
  123. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/rest_client/connection.py +0 -0
  124. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/run_info_store.py +0 -0
  125. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/supernode/__init__.py +0 -0
  126. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/supernode/app.py +0 -0
  127. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/client/typing.py +0 -0
  128. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/__init__.py +0 -0
  129. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/address.py +0 -0
  130. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/args.py +0 -0
  131. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/config.py +0 -0
  132. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/context.py +0 -0
  133. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/date.py +0 -0
  134. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/differential_privacy.py +0 -0
  135. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  136. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/dp.py +0 -0
  137. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/exit_handlers.py +0 -0
  138. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/grpc.py +0 -0
  139. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/message.py +0 -0
  140. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/object_ref.py +0 -0
  141. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/parameter.py +0 -0
  142. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/pyproject.py +0 -0
  143. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/__init__.py +0 -0
  144. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/configsrecord.py +0 -0
  145. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/conversion_utils.py +0 -0
  146. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/metricsrecord.py +0 -0
  147. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/parametersrecord.py +0 -0
  148. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/recordset.py +0 -0
  149. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/record/typeddict.py +0 -0
  150. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/recordset_compat.py +0 -0
  151. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/retry_invoker.py +0 -0
  152. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  153. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  154. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  155. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  156. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  157. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  158. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  159. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  160. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/serde.py +0 -0
  161. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/telemetry.py +0 -0
  162. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/typing.py +0 -0
  163. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/common/version.py +0 -0
  164. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/__init__.py +0 -0
  165. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  166. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  167. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  168. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  169. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/error_pb2.py +0 -0
  170. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/error_pb2.pyi +0 -0
  171. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  172. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  173. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  174. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  175. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fab_pb2.py +0 -0
  176. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  177. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  178. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  179. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fleet_pb2.py +0 -0
  180. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  181. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  182. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  183. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  184. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  185. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  186. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  187. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/log_pb2.py +0 -0
  188. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/log_pb2.pyi +0 -0
  189. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  190. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  191. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/message_pb2.py +0 -0
  192. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/message_pb2.pyi +0 -0
  193. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  194. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  195. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/node_pb2.py +0 -0
  196. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/node_pb2.pyi +0 -0
  197. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  198. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  199. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/recordset_pb2.py +0 -0
  200. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  201. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  202. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  203. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/run_pb2.py +0 -0
  204. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/run_pb2.pyi +0 -0
  205. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  206. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  207. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  208. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  209. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  210. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  211. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  212. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  213. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  214. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  215. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/task_pb2.py +0 -0
  216. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/task_pb2.pyi +0 -0
  217. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  218. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  219. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/transport_pb2.py +0 -0
  220. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  221. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  222. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  223. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/py.typed +0 -0
  224. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/__init__.py +0 -0
  225. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/client_manager.py +0 -0
  226. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/client_proxy.py +0 -0
  227. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/compat/__init__.py +0 -0
  228. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/compat/app.py +0 -0
  229. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/compat/app_utils.py +0 -0
  230. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  231. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/compat/legacy_context.py +0 -0
  232. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/criterion.py +0 -0
  233. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/driver/__init__.py +0 -0
  234. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/driver/driver.py +0 -0
  235. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  236. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  237. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/history.py +0 -0
  238. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/run_serverapp.py +0 -0
  239. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/server.py +0 -0
  240. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/server_app.py +0 -0
  241. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/server_config.py +0 -0
  242. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/serverapp/__init__.py +0 -0
  243. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/serverapp/app.py +0 -0
  244. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/serverapp_components.py +0 -0
  245. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/__init__.py +0 -0
  246. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/aggregate.py +0 -0
  247. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/bulyan.py +0 -0
  248. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  249. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  250. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  251. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  252. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  253. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  254. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedadam.py +0 -0
  255. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedavg.py +0 -0
  256. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  257. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  258. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  259. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedopt.py +0 -0
  260. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedprox.py +0 -0
  261. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  262. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  263. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  264. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  265. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  266. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/krum.py +0 -0
  267. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  268. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/strategy/strategy.py +0 -0
  269. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/__init__.py +0 -0
  270. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  271. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  272. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  273. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  274. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  275. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  276. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  277. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  278. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  279. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  280. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  281. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  282. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  283. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  284. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  285. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  286. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  287. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  288. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  289. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  290. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  291. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  292. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  293. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  294. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  295. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  296. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  297. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  298. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  299. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  300. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  301. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  302. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  303. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/typing.py +0 -0
  304. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/utils/__init__.py +0 -0
  305. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/utils/tensorboard.py +0 -0
  306. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/utils/validator.py +0 -0
  307. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/__init__.py +0 -0
  308. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/constant.py +0 -0
  309. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  310. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  311. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  312. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  313. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/__init__.py +0 -0
  314. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/app.py +0 -0
  315. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/legacy_app.py +0 -0
  316. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  317. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  318. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  319. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  320. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/run_simulation.py +0 -0
  321. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  322. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/__init__.py +0 -0
  323. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/app.py +0 -0
  324. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/deployment.py +0 -0
  325. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/exec_grpc.py +0 -0
  326. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/exec_servicer.py +0 -0
  327. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/src/py/flwr/superexec/executor.py +0 -0
  328. {flwr_nightly-1.14.0.dev20241127 → flwr_nightly-1.14.0.dev20241204}/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.dev20241127
3
+ Version: 1.14.0.dev20241204
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.dev20241127"
7
+ version = "1.14.0.dev20241204"
8
8
  description = "Flower: A Friendly Federated AI Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -0,0 +1,354 @@
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 `ls` command."""
16
+
17
+
18
+ import io
19
+ import json
20
+ from datetime import datetime, timedelta
21
+ from logging import DEBUG
22
+ from pathlib import Path
23
+ from typing import Annotated, Any, Optional, Union
24
+
25
+ import grpc
26
+ import typer
27
+ from rich.console import Console
28
+ from rich.table import Table
29
+ from rich.text import Text
30
+ from typer import Exit
31
+
32
+ from flwr.cli.config_utils import (
33
+ load_and_validate,
34
+ validate_certificate_in_federation_config,
35
+ validate_federation_in_project_config,
36
+ validate_project_config,
37
+ )
38
+ from flwr.common.constant import FAB_CONFIG_FILE, CliOutputFormat, SubStatus
39
+ from flwr.common.date import format_timedelta, isoformat8601_utc
40
+ from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
41
+ from flwr.common.logger import log, redirect_output, remove_emojis, restore_output
42
+ from flwr.common.serde import run_from_proto
43
+ from flwr.common.typing import Run
44
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
45
+ ListRunsRequest,
46
+ ListRunsResponse,
47
+ )
48
+ from flwr.proto.exec_pb2_grpc import ExecStub
49
+
50
+ _RunListType = tuple[int, str, str, str, str, str, str, str, str]
51
+
52
+
53
+ def ls( # pylint: disable=too-many-locals, too-many-branches
54
+ app: Annotated[
55
+ Path,
56
+ typer.Argument(help="Path of the Flower project"),
57
+ ] = Path("."),
58
+ federation: Annotated[
59
+ Optional[str],
60
+ typer.Argument(help="Name of the federation"),
61
+ ] = None,
62
+ runs: Annotated[
63
+ bool,
64
+ typer.Option(
65
+ "--runs",
66
+ help="List all runs",
67
+ ),
68
+ ] = False,
69
+ run_id: Annotated[
70
+ Optional[int],
71
+ typer.Option(
72
+ "--run-id",
73
+ help="Specific run ID to display",
74
+ ),
75
+ ] = None,
76
+ output_format: Annotated[
77
+ str,
78
+ typer.Option(
79
+ "--format",
80
+ case_sensitive=False,
81
+ help="Format output using 'default' view or 'json'",
82
+ ),
83
+ ] = CliOutputFormat.DEFAULT,
84
+ ) -> None:
85
+ """List runs."""
86
+ suppress_output = output_format == CliOutputFormat.JSON
87
+ captured_output = io.StringIO()
88
+ try:
89
+ if suppress_output:
90
+ redirect_output(captured_output)
91
+
92
+ # Load and validate federation config
93
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
94
+
95
+ pyproject_path = app / FAB_CONFIG_FILE if app else None
96
+ config, errors, warnings = load_and_validate(path=pyproject_path)
97
+ config = validate_project_config(config, errors, warnings)
98
+ federation, federation_config = validate_federation_in_project_config(
99
+ federation, config
100
+ )
101
+
102
+ if "address" not in federation_config:
103
+ typer.secho(
104
+ "❌ `flwr ls` currently works with Exec API. Ensure that the correct"
105
+ "Exec API address is provided in the `pyproject.toml`.",
106
+ fg=typer.colors.RED,
107
+ bold=True,
108
+ )
109
+ raise typer.Exit(code=1)
110
+
111
+ try:
112
+ if runs and run_id is not None:
113
+ raise ValueError(
114
+ "The options '--runs' and '--run-id' are mutually exclusive."
115
+ )
116
+
117
+ channel = _init_channel(app, federation_config)
118
+ stub = ExecStub(channel)
119
+
120
+ # Display information about a specific run ID
121
+ if run_id is not None:
122
+ typer.echo(f"🔍 Displaying information for run ID {run_id}...")
123
+ restore_output()
124
+ _display_one_run(stub, run_id, output_format)
125
+ # By default, list all runs
126
+ else:
127
+ typer.echo("📄 Listing all runs...")
128
+ restore_output()
129
+ _list_runs(stub, output_format)
130
+
131
+ except ValueError as err:
132
+ typer.secho(
133
+ f"❌ {err}",
134
+ fg=typer.colors.RED,
135
+ bold=True,
136
+ )
137
+ raise typer.Exit(code=1) from err
138
+ finally:
139
+ channel.close()
140
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
141
+ if suppress_output:
142
+ restore_output()
143
+ e_message = captured_output.getvalue()
144
+ _print_json_error(e_message, err)
145
+ else:
146
+ typer.secho(
147
+ f"{err}",
148
+ fg=typer.colors.RED,
149
+ bold=True,
150
+ )
151
+ finally:
152
+ if suppress_output:
153
+ restore_output()
154
+ captured_output.close()
155
+
156
+
157
+ def on_channel_state_change(channel_connectivity: str) -> None:
158
+ """Log channel connectivity."""
159
+ log(DEBUG, channel_connectivity)
160
+
161
+
162
+ def _init_channel(app: Path, federation_config: dict[str, Any]) -> grpc.Channel:
163
+ """Initialize gRPC channel to the Exec API."""
164
+ insecure, root_certificates_bytes = validate_certificate_in_federation_config(
165
+ app, federation_config
166
+ )
167
+ channel = create_channel(
168
+ server_address=federation_config["address"],
169
+ insecure=insecure,
170
+ root_certificates=root_certificates_bytes,
171
+ max_message_length=GRPC_MAX_MESSAGE_LENGTH,
172
+ interceptors=None,
173
+ )
174
+ channel.subscribe(on_channel_state_change)
175
+ return channel
176
+
177
+
178
+ def _format_runs(run_dict: dict[int, Run], now_isoformat: str) -> list[_RunListType]:
179
+ """Format runs to a list."""
180
+
181
+ def _format_datetime(dt: Optional[datetime]) -> str:
182
+ return isoformat8601_utc(dt).replace("T", " ") if dt else "N/A"
183
+
184
+ run_list: list[_RunListType] = []
185
+
186
+ # Add rows
187
+ for run in sorted(
188
+ run_dict.values(), key=lambda x: datetime.fromisoformat(x.pending_at)
189
+ ):
190
+ # Combine status and sub-status into a single string
191
+ if run.status.sub_status == "":
192
+ status_text = run.status.status
193
+ else:
194
+ status_text = f"{run.status.status}:{run.status.sub_status}"
195
+
196
+ # Convert isoformat to datetime
197
+ pending_at = datetime.fromisoformat(run.pending_at) if run.pending_at else None
198
+ running_at = datetime.fromisoformat(run.running_at) if run.running_at else None
199
+ finished_at = (
200
+ datetime.fromisoformat(run.finished_at) if run.finished_at else None
201
+ )
202
+
203
+ # Calculate elapsed time
204
+ elapsed_time = timedelta()
205
+ if running_at:
206
+ if finished_at:
207
+ end_time = finished_at
208
+ else:
209
+ end_time = datetime.fromisoformat(now_isoformat)
210
+ elapsed_time = end_time - running_at
211
+
212
+ run_list.append(
213
+ (
214
+ run.run_id,
215
+ run.fab_id,
216
+ run.fab_version,
217
+ run.fab_hash,
218
+ status_text,
219
+ format_timedelta(elapsed_time),
220
+ _format_datetime(pending_at),
221
+ _format_datetime(running_at),
222
+ _format_datetime(finished_at),
223
+ )
224
+ )
225
+ return run_list
226
+
227
+
228
+ def _to_table(run_list: list[_RunListType]) -> Table:
229
+ """Format the provided run list to a rich Table."""
230
+ table = Table(header_style="bold cyan", show_lines=True)
231
+
232
+ # Add columns
233
+ table.add_column(
234
+ Text("Run ID", justify="center"), style="bright_white", overflow="fold"
235
+ )
236
+ table.add_column(Text("FAB", justify="center"), style="dim white")
237
+ table.add_column(Text("Status", justify="center"))
238
+ table.add_column(Text("Elapsed", justify="center"), style="blue")
239
+ table.add_column(Text("Created At", justify="center"), style="dim white")
240
+ table.add_column(Text("Running At", justify="center"), style="dim white")
241
+ table.add_column(Text("Finished At", justify="center"), style="dim white")
242
+
243
+ for row in run_list:
244
+ (
245
+ run_id,
246
+ fab_id,
247
+ fab_version,
248
+ _,
249
+ status_text,
250
+ elapsed,
251
+ created_at,
252
+ running_at,
253
+ finished_at,
254
+ ) = row
255
+ # Style the status based on its value
256
+ sub_status = status_text.rsplit(":", maxsplit=1)[-1]
257
+ if sub_status == SubStatus.COMPLETED:
258
+ status_style = "green"
259
+ elif sub_status == SubStatus.FAILED:
260
+ status_style = "red"
261
+ else:
262
+ status_style = "yellow"
263
+
264
+ formatted_row = (
265
+ f"[bold]{run_id}[/bold]",
266
+ f"{fab_id} (v{fab_version})",
267
+ f"[{status_style}]{status_text}[/{status_style}]",
268
+ elapsed,
269
+ created_at,
270
+ running_at,
271
+ finished_at,
272
+ )
273
+ table.add_row(*formatted_row)
274
+
275
+ return table
276
+
277
+
278
+ def _to_json(run_list: list[_RunListType]) -> str:
279
+ """Format run status list to a JSON formatted string."""
280
+ runs_list = []
281
+ for row in run_list:
282
+ (
283
+ run_id,
284
+ fab_id,
285
+ fab_version,
286
+ fab_hash,
287
+ status_text,
288
+ elapsed,
289
+ created_at,
290
+ running_at,
291
+ finished_at,
292
+ ) = row
293
+ runs_list.append(
294
+ {
295
+ "run-id": run_id,
296
+ "fab-id": fab_id,
297
+ "fab-name": fab_id.split("/")[-1],
298
+ "fab-version": fab_version,
299
+ "fab-hash": fab_hash[:8],
300
+ "status": status_text,
301
+ "elapsed": elapsed,
302
+ "created-at": created_at,
303
+ "running-at": running_at,
304
+ "finished-at": finished_at,
305
+ }
306
+ )
307
+
308
+ return json.dumps({"success": True, "runs": runs_list})
309
+
310
+
311
+ def _list_runs(
312
+ stub: ExecStub,
313
+ output_format: str = CliOutputFormat.DEFAULT,
314
+ ) -> None:
315
+ """List all runs."""
316
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest())
317
+ run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
318
+
319
+ formatted_runs = _format_runs(run_dict, res.now)
320
+ if output_format == CliOutputFormat.JSON:
321
+ Console().print_json(_to_json(formatted_runs))
322
+ else:
323
+ Console().print(_to_table(formatted_runs))
324
+
325
+
326
+ def _display_one_run(
327
+ stub: ExecStub,
328
+ run_id: int,
329
+ output_format: str = CliOutputFormat.DEFAULT,
330
+ ) -> None:
331
+ """Display information about a specific run."""
332
+ res: ListRunsResponse = stub.ListRuns(ListRunsRequest(run_id=run_id))
333
+ if not res.run_dict:
334
+ raise ValueError(f"Run ID {run_id} not found")
335
+
336
+ run_dict = {run_id: run_from_proto(proto) for run_id, proto in res.run_dict.items()}
337
+
338
+ formatted_runs = _format_runs(run_dict, res.now)
339
+ if output_format == CliOutputFormat.JSON:
340
+ Console().print_json(_to_json(formatted_runs))
341
+ else:
342
+ Console().print(_to_table(formatted_runs))
343
+
344
+
345
+ def _print_json_error(msg: str, e: Union[Exit, Exception]) -> None:
346
+ """Print error message as JSON."""
347
+ Console().print_json(
348
+ json.dumps(
349
+ {
350
+ "success": False,
351
+ "error-message": remove_emojis(str(msg) + "\n" + str(e)),
352
+ }
353
+ )
354
+ )
@@ -14,16 +14,19 @@
14
14
  # ==============================================================================
15
15
  """Flower command line interface `run` command."""
16
16
 
17
+ import io
17
18
  import json
18
19
  import subprocess
19
20
  from logging import DEBUG
20
21
  from pathlib import Path
21
- from typing import Annotated, Any, Optional
22
+ from typing import Annotated, Any, Optional, Union
22
23
 
23
24
  import typer
25
+ from rich.console import Console
24
26
 
25
27
  from flwr.cli.build import build
26
28
  from flwr.cli.config_utils import (
29
+ get_fab_metadata,
27
30
  load_and_validate,
28
31
  validate_certificate_in_federation_config,
29
32
  validate_federation_in_project_config,
@@ -34,8 +37,9 @@ from flwr.common.config import (
34
37
  parse_config_args,
35
38
  user_config_to_configsrecord,
36
39
  )
40
+ from flwr.common.constant import CliOutputFormat
37
41
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
38
- from flwr.common.logger import log
42
+ from flwr.common.logger import log, redirect_output, remove_emojis, restore_output
39
43
  from flwr.common.serde import (
40
44
  configs_record_to_proto,
41
45
  fab_to_proto,
@@ -85,21 +89,51 @@ def run(
85
89
  "logs are not streamed by default.",
86
90
  ),
87
91
  ] = False,
92
+ output_format: Annotated[
93
+ str,
94
+ typer.Option(
95
+ "--format",
96
+ case_sensitive=False,
97
+ help="Format output using 'default' view or 'json'",
98
+ ),
99
+ ] = CliOutputFormat.DEFAULT,
88
100
  ) -> None:
89
101
  """Run Flower App."""
90
- typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
102
+ suppress_output = output_format == CliOutputFormat.JSON
103
+ captured_output = io.StringIO()
104
+ try:
105
+ if suppress_output:
106
+ redirect_output(captured_output)
107
+ typer.secho("Loading project configuration... ", fg=typer.colors.BLUE)
91
108
 
92
- pyproject_path = app / "pyproject.toml" if app else None
93
- config, errors, warnings = load_and_validate(path=pyproject_path)
94
- config = validate_project_config(config, errors, warnings)
95
- federation, federation_config = validate_federation_in_project_config(
96
- federation, config
97
- )
109
+ pyproject_path = app / "pyproject.toml" if app else None
110
+ config, errors, warnings = load_and_validate(path=pyproject_path)
111
+ config = validate_project_config(config, errors, warnings)
112
+ federation, federation_config = validate_federation_in_project_config(
113
+ federation, config
114
+ )
98
115
 
99
- if "address" in federation_config:
100
- _run_with_exec_api(app, federation_config, config_overrides, stream)
101
- else:
102
- _run_without_exec_api(app, federation_config, config_overrides, federation)
116
+ if "address" in federation_config:
117
+ _run_with_exec_api(
118
+ app, federation_config, config_overrides, stream, output_format
119
+ )
120
+ else:
121
+ _run_without_exec_api(app, federation_config, config_overrides, federation)
122
+ except (typer.Exit, Exception) as err: # pylint: disable=broad-except
123
+ if suppress_output:
124
+ restore_output()
125
+ e_message = captured_output.getvalue()
126
+ _print_json_error(e_message, err)
127
+ else:
128
+ typer.secho(
129
+ f"{err}",
130
+ fg=typer.colors.RED,
131
+ bold=True,
132
+ )
133
+ finally:
134
+ if suppress_output:
135
+ restore_output()
136
+ captured_output.close()
103
137
 
104
138
 
105
139
  # pylint: disable-next=too-many-locals
@@ -108,6 +142,7 @@ def _run_with_exec_api(
108
142
  federation_config: dict[str, Any],
109
143
  config_overrides: Optional[list[str]],
110
144
  stream: bool,
145
+ output_format: str,
111
146
  ) -> None:
112
147
 
113
148
  insecure, root_certificates_bytes = validate_certificate_in_federation_config(
@@ -125,6 +160,7 @@ def _run_with_exec_api(
125
160
 
126
161
  fab_path, fab_hash = build(app)
127
162
  content = Path(fab_path).read_bytes()
163
+ fab_id, fab_version = get_fab_metadata(Path(fab_path))
128
164
 
129
165
  # Delete FAB file once the bytes is computed
130
166
  Path(fab_path).unlink()
@@ -142,7 +178,26 @@ def _run_with_exec_api(
142
178
  )
143
179
  res = stub.StartRun(req)
144
180
 
145
- typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
181
+ if res.HasField("run_id"):
182
+ typer.secho(f"🎊 Successfully started run {res.run_id}", fg=typer.colors.GREEN)
183
+ else:
184
+ typer.secho("❌ Failed to start run", fg=typer.colors.RED)
185
+ raise typer.Exit(code=1)
186
+
187
+ if output_format == CliOutputFormat.JSON:
188
+ run_output = json.dumps(
189
+ {
190
+ "success": res.HasField("run_id"),
191
+ "run-id": res.run_id if res.HasField("run_id") else None,
192
+ "fab-id": fab_id,
193
+ "fab-name": fab_id.rsplit("/", maxsplit=1)[-1],
194
+ "fab-version": fab_version,
195
+ "fab-hash": fab_hash[:8],
196
+ "fab-filename": fab_path,
197
+ }
198
+ )
199
+ restore_output()
200
+ Console().print_json(run_output)
146
201
 
147
202
  if stream:
148
203
  start_stream(res.run_id, channel, CONN_REFRESH_PERIOD)
@@ -194,3 +249,15 @@ def _run_without_exec_api(
194
249
  check=True,
195
250
  text=True,
196
251
  )
252
+
253
+
254
+ def _print_json_error(msg: str, e: Union[typer.Exit, Exception]) -> None:
255
+ """Print error message as JSON."""
256
+ Console().print_json(
257
+ json.dumps(
258
+ {
259
+ "success": False,
260
+ "error-message": remove_emojis(str(msg) + "\n" + str(e)),
261
+ }
262
+ )
263
+ )
@@ -181,3 +181,14 @@ class SubStatus:
181
181
  def __new__(cls) -> SubStatus:
182
182
  """Prevent instantiation."""
183
183
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
184
+
185
+
186
+ class CliOutputFormat:
187
+ """Define output format for `flwr` CLI commands."""
188
+
189
+ DEFAULT = "default"
190
+ JSON = "json"
191
+
192
+ def __new__(cls) -> CliOutputFormat:
193
+ """Prevent instantiation."""
194
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
@@ -14,11 +14,12 @@
14
14
  # ==============================================================================
15
15
  """Flower Logger."""
16
16
 
17
-
18
17
  import logging
18
+ import re
19
19
  import sys
20
20
  import threading
21
21
  import time
22
+ from io import StringIO
22
23
  from logging import WARN, LogRecord
23
24
  from logging.handlers import HTTPHandler
24
25
  from queue import Empty, Queue
@@ -303,6 +304,13 @@ def restore_output() -> None:
303
304
  console_handler.stream = sys.stdout
304
305
 
305
306
 
307
+ def redirect_output(output_buffer: StringIO) -> None:
308
+ """Redirect stdout and stderr to text I/O buffer."""
309
+ sys.stdout = output_buffer
310
+ sys.stderr = output_buffer
311
+ console_handler.stream = sys.stdout
312
+
313
+
306
314
  def _log_uploader(
307
315
  log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: ServerAppIoStub
308
316
  ) -> None:
@@ -366,3 +374,19 @@ def stop_log_uploader(
366
374
  """Stop the log uploader thread."""
367
375
  log_queue.put(None)
368
376
  log_uploader.join()
377
+
378
+
379
+ def remove_emojis(text: str) -> str:
380
+ """Remove emojis from the provided text."""
381
+ emoji_pattern = re.compile(
382
+ "["
383
+ "\U0001F600-\U0001F64F" # Emoticons
384
+ "\U0001F300-\U0001F5FF" # Symbols & Pictographs
385
+ "\U0001F680-\U0001F6FF" # Transport & Map Symbols
386
+ "\U0001F1E0-\U0001F1FF" # Flags
387
+ "\U00002702-\U000027B0" # Dingbats
388
+ "\U000024C2-\U0001F251"
389
+ "]+",
390
+ flags=re.UNICODE,
391
+ )
392
+ return emoji_pattern.sub(r"", text)
@@ -18,7 +18,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
18
18
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\x32\xe9\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x62\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x14\x66lwr/proto/run.proto\"\xfb\x01\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12\x35\n\x12\x66\x65\x64\x65ration_options\x18\x03 \x01(\x0b\x32\x19.flwr.proto.ConfigsRecord\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"2\n\x10StartRunResponse\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\"1\n\x0fListRunsRequest\x12\x13\n\x06run_id\x18\x01 \x01(\x04H\x00\x88\x01\x01\x42\t\n\x07_run_id\"\x9d\x01\n\x10ListRunsResponse\x12;\n\x08run_dict\x18\x01 \x03(\x0b\x32).flwr.proto.ListRunsResponse.RunDictEntry\x12\x0b\n\x03now\x18\x02 \x01(\t\x1a?\n\x0cRunDictEntry\x12\x0b\n\x03key\x18\x01 \x01(\x04\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run:\x02\x38\x01\x32\xe9\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x12G\n\x08ListRuns\x12\x1b.flwr.proto.ListRunsRequest\x1a\x1c.flwr.proto.ListRunsResponse\"\x00\x62\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -34,17 +34,17 @@ if _descriptor._USE_C_DESCRIPTORS == False:
34
34
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_start=316
35
35
  _globals['_STARTRUNREQUEST_OVERRIDECONFIGENTRY']._serialized_end=389
36
36
  _globals['_STARTRUNRESPONSE']._serialized_start=391
37
- _globals['_STARTRUNRESPONSE']._serialized_end=425
38
- _globals['_STREAMLOGSREQUEST']._serialized_start=427
39
- _globals['_STREAMLOGSREQUEST']._serialized_end=487
40
- _globals['_STREAMLOGSRESPONSE']._serialized_start=489
41
- _globals['_STREAMLOGSRESPONSE']._serialized_end=555
42
- _globals['_LISTRUNSREQUEST']._serialized_start=557
43
- _globals['_LISTRUNSREQUEST']._serialized_end=606
44
- _globals['_LISTRUNSRESPONSE']._serialized_start=609
45
- _globals['_LISTRUNSRESPONSE']._serialized_end=766
46
- _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=703
47
- _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=766
48
- _globals['_EXEC']._serialized_start=769
49
- _globals['_EXEC']._serialized_end=1002
37
+ _globals['_STARTRUNRESPONSE']._serialized_end=441
38
+ _globals['_STREAMLOGSREQUEST']._serialized_start=443
39
+ _globals['_STREAMLOGSREQUEST']._serialized_end=503
40
+ _globals['_STREAMLOGSRESPONSE']._serialized_start=505
41
+ _globals['_STREAMLOGSRESPONSE']._serialized_end=571
42
+ _globals['_LISTRUNSREQUEST']._serialized_start=573
43
+ _globals['_LISTRUNSREQUEST']._serialized_end=622
44
+ _globals['_LISTRUNSRESPONSE']._serialized_start=625
45
+ _globals['_LISTRUNSRESPONSE']._serialized_end=782
46
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_start=719
47
+ _globals['_LISTRUNSRESPONSE_RUNDICTENTRY']._serialized_end=782
48
+ _globals['_EXEC']._serialized_start=785
49
+ _globals['_EXEC']._serialized_end=1018
50
50
  # @@protoc_insertion_point(module_scope)
@@ -57,9 +57,11 @@ class StartRunResponse(google.protobuf.message.Message):
57
57
  run_id: builtins.int
58
58
  def __init__(self,
59
59
  *,
60
- run_id: builtins.int = ...,
60
+ run_id: typing.Optional[builtins.int] = ...,
61
61
  ) -> None: ...
62
- def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
62
+ def HasField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> builtins.bool: ...
63
+ def ClearField(self, field_name: typing_extensions.Literal["_run_id",b"_run_id","run_id",b"run_id"]) -> None: ...
64
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_run_id",b"_run_id"]) -> typing.Optional[typing_extensions.Literal["run_id"]]: ...
63
65
  global___StartRunResponse = StartRunResponse
64
66
 
65
67
  class StreamLogsRequest(google.protobuf.message.Message):
@@ -360,7 +360,7 @@ def run_superlink() -> None:
360
360
  "Node authentication enabled with %d known public keys",
361
361
  len(node_public_keys),
362
362
  )
363
- interceptors = [AuthenticateServerInterceptor(state)]
363
+ interceptors = [AuthenticateServerInterceptor(state_factory)]
364
364
 
365
365
  fleet_server = _run_fleet_api_grpc_rere(
366
366
  address=fleet_address,
@@ -263,7 +263,7 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
263
263
  self, request: UpdateRunStatusRequest, context: grpc.ServicerContext
264
264
  ) -> UpdateRunStatusResponse:
265
265
  """Update the status of a run."""
266
- log(DEBUG, "ControlServicer.UpdateRunStatus")
266
+ log(DEBUG, "ServerAppIoServicer.UpdateRunStatus")
267
267
  state = self.state_factory.state()
268
268
 
269
269
  # Update the run status