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.
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/PKG-INFO +1 -1
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/pyproject.toml +1 -1
- flwr_nightly-1.15.0.dev20250128/src/py/flwr/cli/auth_plugin/__init__.py +31 -0
- flwr_nightly-1.15.0.dev20250128/src/py/flwr/cli/auth_plugin/oidc_cli_plugin.py +150 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/login/login.py +9 -3
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/utils.py +19 -19
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/supernode/app.py +0 -24
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/constant.py +11 -1
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/logger.py +20 -6
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/app.py +2 -2
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/grpc_driver.py +3 -3
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp/app.py +1 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +4 -2
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/LICENSE +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/README.md +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {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
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/auth_plugin/auth_plugin.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/exit.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit/exit_code.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {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
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {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
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/superexec/simulation.py +0 -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.
|
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
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/login/login.py
RENAMED
@@ -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
|
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
|
-
|
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
|
-
|
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)
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/utils.py
RENAMED
@@ -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
|
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[
|
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()
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
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",
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/constant.py
RENAMED
@@ -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
|
-
|
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.")
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/common/logger.py
RENAMED
@@ -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(
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/server/app.py
RENAMED
@@ -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
|
-
|
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(
|
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
|
-
[
|
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, "[
|
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, "[
|
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
|
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)
|
File without changes
|
File without changes
|
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/__init__.py
RENAMED
File without changes
|
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/build.py
RENAMED
File without changes
|
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/config_utils.py
RENAMED
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/constant.py
RENAMED
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/example.py
RENAMED
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/install.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/__init__.py
RENAMED
File without changes
|
{flwr_nightly-1.15.0.dev20250125 → flwr_nightly-1.15.0.dev20250128}/src/py/flwr/cli/new/new.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|