flwr-nightly 1.15.0.dev20250125__tar.gz → 1.15.0.dev20250128__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/PKG-INFO +1 -1
  2. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/pyproject.toml +1 -1
  3. flwr_nightly-1.15.0.dev20250128/src/py/flwr/cli/auth_plugin/__init__.py +31 -0
  4. flwr_nightly-1.15.0.dev20250128/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +150 -0
  5. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/login/login.py +9 -3
  6. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/utils.py +19 -19
  7. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/supernode/app.py +0 -24
  8. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/constant.py +11 -1
  9. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/logger.py +20 -6
  10. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/app.py +2 -2
  11. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/grpc_driver.py +3 -3
  12. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp/app.py +1 -0
  13. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +4 -2
  14. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/LICENSE +0 -0
  15. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/README.md +0 -0
  16. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/__init__.py +0 -0
  17. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/__init__.py +0 -0
  18. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/app.py +0 -0
  19. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/build.py +0 -0
  20. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
  21. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/config_utils.py +0 -0
  22. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/constant.py +0 -0
  23. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/example.py +0 -0
  24. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/install.py +0 -0
  25. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/log.py +0 -0
  26. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/login/__init__.py +0 -0
  27. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/ls.py +0 -0
  28. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/__init__.py +0 -0
  29. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/new.py +0 -0
  30. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  31. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
  32. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
  33. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
  34. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
  35. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  36. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  37. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
  38. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  39. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  40. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
  41. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
  42. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
  43. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
  44. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  45. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  46. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
  47. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  48. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
  49. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
  50. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
  51. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
  52. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
  53. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
  54. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
  55. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
  56. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
  57. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
  58. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
  59. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
  60. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  61. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  62. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
  63. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  64. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
  65. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
  66. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
  67. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
  68. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
  69. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  70. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
  71. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
  72. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
  73. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
  74. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
  75. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
  76. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
  77. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
  78. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  79. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  80. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
  81. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  82. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/run/__init__.py +0 -0
  83. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/run/run.py +0 -0
  84. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/stop.py +0 -0
  85. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/__init__.py +0 -0
  86. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/app.py +0 -0
  87. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/client.py +0 -0
  88. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/client_app.py +0 -0
  89. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/__init__.py +0 -0
  90. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/app.py +0 -0
  91. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
  92. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/utils.py +0 -0
  93. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  94. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
  95. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
  96. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  97. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_client/connection.py +0 -0
  98. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  99. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
  100. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  101. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
  102. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/heartbeat.py +0 -0
  103. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/__init__.py +0 -0
  104. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/message_handler.py +0 -0
  105. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  106. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/__init__.py +0 -0
  107. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  108. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/comms_mods.py +0 -0
  109. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  110. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  111. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  112. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
  113. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/utils.py +0 -0
  114. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/__init__.py +0 -0
  115. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
  116. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/nodestate.py +0 -0
  117. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
  118. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/numpy_client.py +0 -0
  119. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/rest_client/__init__.py +0 -0
  120. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/rest_client/connection.py +0 -0
  121. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/run_info_store.py +0 -0
  122. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/supernode/__init__.py +0 -0
  123. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/typing.py +0 -0
  124. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/__init__.py +0 -0
  125. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/address.py +0 -0
  126. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/args.py +0 -0
  127. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
  128. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
  129. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/config.py +0 -0
  130. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/context.py +0 -0
  131. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/date.py +0 -0
  132. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/differential_privacy.py +0 -0
  133. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  134. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/dp.py +0 -0
  135. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/__init__.py +0 -0
  136. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/exit.py +0 -0
  137. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/exit_code.py +0 -0
  138. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit_handlers.py +0 -0
  139. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/grpc.py +0 -0
  140. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/message.py +0 -0
  141. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/object_ref.py +0 -0
  142. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/parameter.py +0 -0
  143. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/pyproject.py +0 -0
  144. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/__init__.py +0 -0
  145. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/configsrecord.py +0 -0
  146. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/conversion_utils.py +0 -0
  147. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/metricsrecord.py +0 -0
  148. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/parametersrecord.py +0 -0
  149. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/recordset.py +0 -0
  150. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/typeddict.py +0 -0
  151. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/recordset_compat.py +0 -0
  152. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/retry_invoker.py +0 -0
  153. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  154. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  155. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  156. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  157. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  158. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  159. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  160. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  161. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/serde.py +0 -0
  162. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/telemetry.py +0 -0
  163. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/typing.py +0 -0
  164. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/version.py +0 -0
  165. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/__init__.py +0 -0
  166. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2.py +0 -0
  167. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
  168. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
  169. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
  170. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2.py +0 -0
  171. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2.pyi +0 -0
  172. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  173. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  174. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2.py +0 -0
  175. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2.pyi +0 -0
  176. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
  177. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
  178. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2.py +0 -0
  179. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2.pyi +0 -0
  180. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
  181. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
  182. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2.py +0 -0
  183. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
  184. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
  185. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
  186. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
  187. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
  188. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
  189. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
  190. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2.py +0 -0
  191. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2.pyi +0 -0
  192. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
  193. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
  194. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2.py +0 -0
  195. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2.pyi +0 -0
  196. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
  197. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
  198. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2.py +0 -0
  199. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2.pyi +0 -0
  200. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  201. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  202. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2.py +0 -0
  203. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  204. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  205. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  206. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2.py +0 -0
  207. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2.pyi +0 -0
  208. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
  209. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
  210. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2.py +0 -0
  211. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
  212. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
  213. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
  214. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2.py +0 -0
  215. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
  216. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
  217. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
  218. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2.py +0 -0
  219. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2.pyi +0 -0
  220. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  221. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  222. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2.py +0 -0
  223. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  224. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  225. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  226. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/py.typed +0 -0
  227. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/__init__.py +0 -0
  228. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/client_manager.py +0 -0
  229. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/client_proxy.py +0 -0
  230. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/__init__.py +0 -0
  231. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/app.py +0 -0
  232. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/app_utils.py +0 -0
  233. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
  234. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/legacy_context.py +0 -0
  235. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/criterion.py +0 -0
  236. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/__init__.py +0 -0
  237. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/driver.py +0 -0
  238. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
  239. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/history.py +0 -0
  240. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/run_serverapp.py +0 -0
  241. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server.py +0 -0
  242. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server_app.py +0 -0
  243. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server_config.py +0 -0
  244. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp/__init__.py +0 -0
  245. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp_components.py +0 -0
  246. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/__init__.py +0 -0
  247. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/aggregate.py +0 -0
  248. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/bulyan.py +0 -0
  249. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  250. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  251. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  252. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  253. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  254. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  255. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedadam.py +0 -0
  256. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavg.py +0 -0
  257. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  258. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  259. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  260. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedopt.py +0 -0
  261. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedprox.py +0 -0
  262. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  263. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  264. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  265. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  266. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  267. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/krum.py +0 -0
  268. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  269. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/strategy.py +0 -0
  270. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/__init__.py +0 -0
  271. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  272. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
  273. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
  274. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
  275. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
  276. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
  277. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  278. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
  279. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
  280. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  281. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  282. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  283. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  284. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  285. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  286. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
  287. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
  288. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  289. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
  290. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  291. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  292. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  293. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  294. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  295. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  296. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  297. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
  298. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
  299. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
  300. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
  301. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
  302. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
  303. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
  304. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
  305. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
  306. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/utils.py +0 -0
  307. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/typing.py +0 -0
  308. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/__init__.py +0 -0
  309. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/tensorboard.py +0 -0
  310. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/validator.py +0 -0
  311. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/__init__.py +0 -0
  312. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/constant.py +0 -0
  313. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/default_workflows.py +0 -0
  314. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  315. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  316. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
  317. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/__init__.py +0 -0
  318. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/app.py +0 -0
  319. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/legacy_app.py +0 -0
  320. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  321. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  322. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
  323. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  324. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/run_simulation.py +0 -0
  325. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/simulationio_connection.py +0 -0
  326. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/__init__.py +0 -0
  327. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/app.py +0 -0
  328. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/deployment.py +0 -0
  329. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_grpc.py +0 -0
  330. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_servicer.py +0 -0
  331. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
  332. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/executor.py +0 -0
  333. {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.15.0.dev20250125
3
+ Version: 1.15.0.dev20250128
4
4
  Summary: Flower: A Friendly Federated AI Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.15.0.dev20250125"
7
+ version = "1.15.0.dev20250128"
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,31 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower user auth plugins."""
16
+
17
+
18
+ from flwr.common.auth_plugin import CliAuthPlugin
19
+ from flwr.common.constant import AuthType
20
+
21
+ from .oidc_cli_plugin import OidcCliPlugin
22
+
23
+
24
+ def get_cli_auth_plugins() -> dict[str, type[CliAuthPlugin]]:
25
+ """Return all CLI authentication plugins."""
26
+ return {AuthType.OIDC: OidcCliPlugin}
27
+
28
+
29
+ __all__ = [
30
+ "get_cli_auth_plugins",
31
+ ]
@@ -0,0 +1,150 @@
1
+ # Copyright 2025 Flower Labs GmbH. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ # ==============================================================================
15
+ """Flower CLI user auth plugin for OIDC."""
16
+
17
+
18
+ import json
19
+ import time
20
+ from collections.abc import Sequence
21
+ from pathlib import Path
22
+ from typing import Any, Optional, Union
23
+
24
+ import typer
25
+
26
+ from flwr.common.auth_plugin import CliAuthPlugin
27
+ from flwr.common.constant import (
28
+ ACCESS_TOKEN_KEY,
29
+ AUTH_TYPE_KEY,
30
+ REFRESH_TOKEN_KEY,
31
+ AuthType,
32
+ )
33
+ from flwr.common.typing import UserAuthCredentials, UserAuthLoginDetails
34
+ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
35
+ GetAuthTokensRequest,
36
+ GetAuthTokensResponse,
37
+ )
38
+ from flwr.proto.exec_pb2_grpc import ExecStub
39
+
40
+
41
+ class OidcCliPlugin(CliAuthPlugin):
42
+ """Flower OIDC auth plugin for CLI."""
43
+
44
+ def __init__(self, credentials_path: Path):
45
+ self.access_token: Optional[str] = None
46
+ self.refresh_token: Optional[str] = None
47
+ self.credentials_path = credentials_path
48
+
49
+ @staticmethod
50
+ def login(
51
+ login_details: UserAuthLoginDetails,
52
+ exec_stub: ExecStub,
53
+ ) -> UserAuthCredentials:
54
+ """Authenticate the user and retrieve authentication credentials."""
55
+ typer.secho(
56
+ "Please login with your user credentials here: "
57
+ f"{login_details.verification_uri_complete}",
58
+ fg=typer.colors.BLUE,
59
+ )
60
+ start_time = time.time()
61
+ time.sleep(login_details.interval)
62
+
63
+ while (time.time() - start_time) < login_details.expires_in:
64
+ res: GetAuthTokensResponse = exec_stub.GetAuthTokens(
65
+ GetAuthTokensRequest(device_code=login_details.device_code)
66
+ )
67
+
68
+ access_token = res.access_token
69
+ refresh_token = res.refresh_token
70
+
71
+ if access_token and refresh_token:
72
+ typer.secho(
73
+ "✅ Login successful.",
74
+ fg=typer.colors.GREEN,
75
+ bold=False,
76
+ )
77
+ return UserAuthCredentials(
78
+ access_token=access_token,
79
+ refresh_token=refresh_token,
80
+ )
81
+
82
+ time.sleep(login_details.interval)
83
+
84
+ typer.secho(
85
+ "❌ Timeout, failed to sign in.",
86
+ fg=typer.colors.RED,
87
+ bold=True,
88
+ )
89
+ raise typer.Exit(code=1)
90
+
91
+ def store_tokens(self, credentials: UserAuthCredentials) -> None:
92
+ """Store authentication tokens to the `credentials_path`.
93
+
94
+ The credentials, including tokens, will be saved as a JSON file
95
+ at `credentials_path`.
96
+ """
97
+ self.access_token = credentials.access_token
98
+ self.refresh_token = credentials.refresh_token
99
+ json_dict = {
100
+ AUTH_TYPE_KEY: AuthType.OIDC,
101
+ ACCESS_TOKEN_KEY: credentials.access_token,
102
+ REFRESH_TOKEN_KEY: credentials.refresh_token,
103
+ }
104
+
105
+ with open(self.credentials_path, "w", encoding="utf-8") as file:
106
+ json.dump(json_dict, file, indent=4)
107
+
108
+ def load_tokens(self) -> None:
109
+ """Load authentication tokens from the `credentials_path`."""
110
+ with open(self.credentials_path, encoding="utf-8") as file:
111
+ json_dict: dict[str, Any] = json.load(file)
112
+ access_token = json_dict.get(ACCESS_TOKEN_KEY)
113
+ refresh_token = json_dict.get(REFRESH_TOKEN_KEY)
114
+
115
+ if isinstance(access_token, str) and isinstance(refresh_token, str):
116
+ self.access_token = access_token
117
+ self.refresh_token = refresh_token
118
+
119
+ def write_tokens_to_metadata(
120
+ self, metadata: Sequence[tuple[str, Union[str, bytes]]]
121
+ ) -> Sequence[tuple[str, Union[str, bytes]]]:
122
+ """Write authentication tokens to the provided metadata."""
123
+ if self.access_token is None or self.refresh_token is None:
124
+ typer.secho(
125
+ "❌ Missing authentication tokens. Please login first.",
126
+ fg=typer.colors.RED,
127
+ bold=True,
128
+ )
129
+ raise typer.Exit(code=1)
130
+
131
+ return list(metadata) + [
132
+ (ACCESS_TOKEN_KEY, self.access_token),
133
+ (REFRESH_TOKEN_KEY, self.refresh_token),
134
+ ]
135
+
136
+ def read_tokens_from_metadata(
137
+ self, metadata: Sequence[tuple[str, Union[str, bytes]]]
138
+ ) -> Optional[UserAuthCredentials]:
139
+ """Read authentication tokens from the provided metadata."""
140
+ metadata_dict = dict(metadata)
141
+ access_token = metadata_dict.get(ACCESS_TOKEN_KEY)
142
+ refresh_token = metadata_dict.get(REFRESH_TOKEN_KEY)
143
+
144
+ if isinstance(access_token, str) and isinstance(refresh_token, str):
145
+ return UserAuthCredentials(
146
+ access_token=access_token,
147
+ refresh_token=refresh_token,
148
+ )
149
+
150
+ return None
@@ -34,7 +34,11 @@ from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
34
34
  )
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 (
38
+ init_channel,
39
+ try_obtain_cli_auth_plugin,
40
+ unauthenticated_exc_handler,
41
+ )
38
42
 
39
43
 
40
44
  def login( # pylint: disable=R0914
@@ -81,7 +85,8 @@ def login( # pylint: disable=R0914
81
85
  stub = ExecStub(channel)
82
86
 
83
87
  login_request = GetLoginDetailsRequest()
84
- login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
88
+ with unauthenticated_exc_handler():
89
+ login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
85
90
 
86
91
  # Get the auth plugin
87
92
  auth_type = login_response.auth_type
@@ -104,7 +109,8 @@ def login( # pylint: disable=R0914
104
109
  expires_in=login_response.expires_in,
105
110
  interval=login_response.interval,
106
111
  )
107
- credentials = auth_plugin.login(details, stub)
112
+ with unauthenticated_exc_handler():
113
+ credentials = auth_plugin.login(details, stub)
108
114
 
109
115
  # Store the tokens
110
116
  auth_plugin.store_tokens(credentials)
@@ -29,20 +29,13 @@ import typer
29
29
 
30
30
  from flwr.cli.cli_user_auth_interceptor import CliUserAuthInterceptor
31
31
  from flwr.common.auth_plugin import CliAuthPlugin
32
- from flwr.common.constant import AUTH_TYPE, CREDENTIALS_DIR, FLWR_DIR
32
+ from flwr.common.constant import AUTH_TYPE_KEY, CREDENTIALS_DIR, FLWR_DIR
33
33
  from flwr.common.grpc import GRPC_MAX_MESSAGE_LENGTH, create_channel
34
34
  from flwr.common.logger import log
35
35
 
36
+ from .auth_plugin import get_cli_auth_plugins
36
37
  from .config_utils import validate_certificate_in_federation_config
37
38
 
38
- try:
39
- from flwr.ee import get_cli_auth_plugins
40
- except ImportError:
41
-
42
- def get_cli_auth_plugins() -> dict[str, type[CliAuthPlugin]]:
43
- """Return all CLI authentication plugins."""
44
- raise NotImplementedError("No authentication plugins are currently supported.")
45
-
46
39
 
47
40
  def prompt_text(
48
41
  text: str,
@@ -244,7 +237,7 @@ def try_obtain_cli_auth_plugin(
244
237
  try:
245
238
  with config_path.open("r", encoding="utf-8") as file:
246
239
  json_file = json.load(file)
247
- auth_type = json_file[AUTH_TYPE]
240
+ auth_type = json_file[AUTH_TYPE_KEY]
248
241
  except (FileNotFoundError, KeyError):
249
242
  typer.secho(
250
243
  "❌ Missing or invalid credentials for user authentication. "
@@ -308,12 +301,19 @@ def unauthenticated_exc_handler() -> Iterator[None]:
308
301
  try:
309
302
  yield
310
303
  except grpc.RpcError as e:
311
- if e.code() != grpc.StatusCode.UNAUTHENTICATED:
312
- raise
313
- typer.secho(
314
- " Authentication failed. Please run `flwr login`"
315
- " to authenticate and try again.",
316
- fg=typer.colors.RED,
317
- bold=True,
318
- )
319
- raise typer.Exit(code=1) from None
304
+ if e.code() == grpc.StatusCode.UNAUTHENTICATED:
305
+ typer.secho(
306
+ "❌ Authentication failed. Please run `flwr login`"
307
+ " to authenticate and try again.",
308
+ fg=typer.colors.RED,
309
+ bold=True,
310
+ )
311
+ raise typer.Exit(code=1) from None
312
+ if e.code() == grpc.StatusCode.UNIMPLEMENTED:
313
+ typer.secho(
314
+ "❌ User authentication is not enabled on this SuperLink.",
315
+ fg=typer.colors.RED,
316
+ bold=True,
317
+ )
318
+ raise typer.Exit(code=1) from None
319
+ raise
@@ -16,7 +16,6 @@
16
16
 
17
17
 
18
18
  import argparse
19
- import sys
20
19
  from logging import DEBUG, ERROR, INFO, WARN
21
20
  from pathlib import Path
22
21
  from typing import Optional
@@ -65,17 +64,6 @@ def run_supernode() -> None:
65
64
  "Ignoring `--flwr-dir`.",
66
65
  )
67
66
 
68
- # Exit if unsupported argument is passed by the user
69
- if args.app is not None:
70
- log(
71
- ERROR,
72
- "The `app` argument is deprecated. The SuperNode now automatically "
73
- "uses the ClientApp delivered from the SuperLink. Providing the app "
74
- "directory manually is no longer supported. Please remove the `app` "
75
- "argument from your command.",
76
- )
77
- sys.exit(1)
78
-
79
67
  root_certificates = try_obtain_root_certificates(args, args.superlink)
80
68
  load_fn = get_load_client_app_fn(
81
69
  default_app_ref="",
@@ -146,18 +134,6 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
146
134
  parser = argparse.ArgumentParser(
147
135
  description="Start a Flower SuperNode",
148
136
  )
149
-
150
- parser.add_argument(
151
- "app",
152
- nargs="?",
153
- default=None,
154
- help=(
155
- "(REMOVED) This argument is removed. The SuperNode now automatically "
156
- "uses the ClientApp delivered from the SuperLink, so there is no need to "
157
- "provide the app directory manually. This argument will be removed in a "
158
- "future version."
159
- ),
160
- )
161
137
  _parse_args_common(parser)
162
138
  parser.add_argument(
163
139
  "--flwr-dir",
@@ -108,7 +108,7 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
108
108
 
109
109
  # Constants for user authentication
110
110
  CREDENTIALS_DIR = ".credentials"
111
- AUTH_TYPE = "auth_type"
111
+ AUTH_TYPE_KEY = "auth_type"
112
112
  ACCESS_TOKEN_KEY = "access_token"
113
113
  REFRESH_TOKEN_KEY = "refresh_token"
114
114
 
@@ -200,3 +200,13 @@ class CliOutputFormat:
200
200
  def __new__(cls) -> CliOutputFormat:
201
201
  """Prevent instantiation."""
202
202
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
203
+
204
+
205
+ class AuthType:
206
+ """User authentication types."""
207
+
208
+ OIDC = "oidc"
209
+
210
+ def __new__(cls) -> AuthType:
211
+ """Prevent instantiation."""
212
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
@@ -17,12 +17,13 @@
17
17
 
18
18
  import json as _json
19
19
  import logging
20
+ import os
20
21
  import re
21
22
  import sys
22
23
  import threading
23
24
  import time
24
25
  from io import StringIO
25
- from logging import WARN, LogRecord
26
+ from logging import ERROR, WARN, LogRecord
26
27
  from logging.handlers import HTTPHandler
27
28
  from queue import Empty, Queue
28
29
  from typing import TYPE_CHECKING, Any, Optional, TextIO, Union
@@ -42,6 +43,7 @@ from .constant import LOG_UPLOAD_INTERVAL
42
43
  LOGGER_NAME = "flwr"
43
44
  FLOWER_LOGGER = logging.getLogger(LOGGER_NAME)
44
45
  FLOWER_LOGGER.setLevel(logging.DEBUG)
46
+ log = FLOWER_LOGGER.log # pylint: disable=invalid-name
45
47
 
46
48
  LOG_COLORS = {
47
49
  "DEBUG": "\033[94m", # Blue
@@ -101,7 +103,7 @@ class ConsoleHandler(StreamHandler):
101
103
 
102
104
 
103
105
  def update_console_handler(
104
- level: Optional[int] = None,
106
+ level: Optional[Union[int, str]] = None,
105
107
  timestamps: Optional[bool] = None,
106
108
  colored: Optional[bool] = None,
107
109
  ) -> None:
@@ -125,6 +127,22 @@ console_handler = ConsoleHandler(
125
127
  console_handler.setLevel(logging.INFO)
126
128
  FLOWER_LOGGER.addHandler(console_handler)
127
129
 
130
+ # Set log level via env var (show timestamps for `DEBUG`)
131
+ if log_level := os.getenv("PYTHONLOGLEVEL"):
132
+ try:
133
+ use_time_stamps = log_level.upper() == "DEBUG"
134
+ update_console_handler(
135
+ level=log_level, timestamps=use_time_stamps, colored=True
136
+ )
137
+ except Exception: # pylint: disable=broad-exception-caught
138
+ # Alert user but don't raise exception
139
+ log(
140
+ ERROR,
141
+ "Failed to set logging level %s. Using default level: %s",
142
+ log_level,
143
+ logging.getLevelName(console_handler.level),
144
+ )
145
+
128
146
 
129
147
  class CustomHTTPHandler(HTTPHandler):
130
148
  """Custom HTTPHandler which overrides the mapLogRecords method."""
@@ -185,10 +203,6 @@ def configure(
185
203
  FLOWER_LOGGER.addHandler(http_handler)
186
204
 
187
205
 
188
- logger = logging.getLogger(LOGGER_NAME) # pylint: disable=invalid-name
189
- log = logger.log # pylint: disable=invalid-name
190
-
191
-
192
206
  def warn_preview_feature(name: str) -> None:
193
207
  """Warn the user when they use a preview feature."""
194
208
  log(
@@ -40,7 +40,7 @@ from flwr.common.args import try_obtain_server_certificates
40
40
  from flwr.common.auth_plugin import ExecAuthPlugin
41
41
  from flwr.common.config import get_flwr_dir, parse_config_args
42
42
  from flwr.common.constant import (
43
- AUTH_TYPE,
43
+ AUTH_TYPE_KEY,
44
44
  CLIENT_OCTET,
45
45
  EXEC_API_DEFAULT_SERVER_ADDRESS,
46
46
  FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
@@ -578,7 +578,7 @@ def _try_obtain_exec_auth_plugin(
578
578
 
579
579
  # Load authentication configuration
580
580
  auth_config: dict[str, Any] = config.get("authentication", {})
581
- auth_type: str = auth_config.get(AUTH_TYPE, "")
581
+ auth_type: str = auth_config.get(AUTH_TYPE_KEY, "")
582
582
 
583
583
  # Load authentication plugin
584
584
  try:
@@ -49,7 +49,7 @@ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E
49
49
  from .driver import Driver
50
50
 
51
51
  ERROR_MESSAGE_DRIVER_NOT_CONNECTED = """
52
- [Driver] Error: Not connected.
52
+ [flwr-serverapp] Error: Not connected.
53
53
 
54
54
  Call `connect()` on the `GrpcDriverStub` instance before calling any of the other
55
55
  `GrpcDriverStub` methods.
@@ -102,7 +102,7 @@ class GrpcDriver(Driver):
102
102
  )
103
103
  self._grpc_stub = ServerAppIoStub(self._channel)
104
104
  _wrap_stub(self._grpc_stub, self._retry_invoker)
105
- log(DEBUG, "[Driver] Connected to %s", self._addr)
105
+ log(DEBUG, "[flwr-serverapp] Connected to %s", self._addr)
106
106
 
107
107
  def _disconnect(self) -> None:
108
108
  """Disconnect from the ServerAppIo API."""
@@ -113,7 +113,7 @@ class GrpcDriver(Driver):
113
113
  self._channel = None
114
114
  self._grpc_stub = None
115
115
  channel.close()
116
- log(DEBUG, "[Driver] Disconnected")
116
+ log(DEBUG, "[flwr-serverapp] Disconnected")
117
117
 
118
118
  def set_run(self, run_id: int) -> None:
119
119
  """Set the run."""
@@ -122,6 +122,7 @@ def run_serverapp( # pylint: disable=R0914, disable=W0212, disable=R0915
122
122
  # Pull ServerAppInputs from LinkState
123
123
  req = PullServerAppInputsRequest()
124
124
  res: PullServerAppInputsResponse = driver._stub.PullServerAppInputs(req)
125
+ log(DEBUG, "flwr-serverapp: PullServerAppInputs")
125
126
  if not res.HasField("run"):
126
127
  sleep(3)
127
128
  run_status = None
@@ -362,9 +362,8 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
362
362
  ) -> PullServerAppInputsResponse:
363
363
  """Pull ServerApp process inputs."""
364
364
  log(DEBUG, "ServerAppIoServicer.PullServerAppInputs")
365
- # Init access to LinkState and Ffs
365
+ # Init access to LinkState
366
366
  state = self.state_factory.state()
367
- ffs = self.ffs_factory.ffs()
368
367
 
369
368
  # Lock access to LinkState, preventing obtaining the same pending run_id
370
369
  with self.lock:
@@ -374,6 +373,9 @@ class ServerAppIoServicer(serverappio_pb2_grpc.ServerAppIoServicer):
374
373
  if run_id is None:
375
374
  return PullServerAppInputsResponse()
376
375
 
376
+ # Init access to Ffs
377
+ ffs = self.ffs_factory.ffs()
378
+
377
379
  # Retrieve Context, Run and Fab for the run_id
378
380
  serverapp_ctxt = state.get_serverapp_context(run_id)
379
381
  run = state.get_run(run_id)