flwr-nightly 1.15.0.dev20250107__tar.gz → 1.15.0.dev20250112__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.dev20250107 → flwr_nightly-1.15.0.dev20250112}/PKG-INFO +4 -4
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/README.md +1 -1
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/pyproject.toml +3 -3
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/cli_user_auth_interceptor.py +6 -2
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/login.py +11 -4
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/utils.py +4 -4
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/app.py +17 -9
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +6 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +16 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/auth_plugin.py +33 -23
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/constant.py +2 -0
- flwr_nightly-1.15.0.dev20250107/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py → flwr_nightly-1.15.0.dev20250112/src/py/flwr/common/grpc.py +51 -121
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/typing.py +20 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.py +12 -24
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2.pyi +27 -54
- flwr_nightly-1.15.0.dev20250112/src/py/flwr/proto/fleet_pb2.py +69 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2.pyi +84 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.py +66 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fleet_pb2_grpc.pyi +20 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/app.py +53 -33
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +1 -1
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +22 -8
- flwr_nightly-1.15.0.dev20250112/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +126 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +16 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -1
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +26 -22
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate.py +10 -4
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +50 -29
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_grpc.py +1 -1
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_servicer.py +23 -2
- flwr_nightly-1.15.0.dev20250107/src/py/flwr/common/grpc.py +0 -68
- flwr_nightly-1.15.0.dev20250107/src/py/flwr/proto/fleet_pb2.py +0 -56
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/LICENSE +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/rest_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/supernode/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/exit_handlers.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/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.
|
3
|
+
Version: 1.15.0.dev20250112
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
5
|
Home-page: https://flower.ai
|
6
6
|
License: Apache-2.0
|
@@ -43,11 +43,11 @@ Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
43
43
|
Requires-Dist: ray (==2.10.0) ; (python_version >= "3.9" and python_version < "3.12") and (extra == "simulation")
|
44
44
|
Requires-Dist: requests (>=2.31.0,<3.0.0)
|
45
45
|
Requires-Dist: rich (>=13.5.0,<14.0.0)
|
46
|
-
Requires-Dist: starlette (>=0.
|
46
|
+
Requires-Dist: starlette (>=0.45.2,<0.46.0) ; extra == "rest"
|
47
47
|
Requires-Dist: tomli (>=2.0.1,<3.0.0)
|
48
48
|
Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
49
49
|
Requires-Dist: typer (>=0.12.5,<0.13.0)
|
50
|
-
Requires-Dist: uvicorn[standard] (>=0.
|
50
|
+
Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
|
51
51
|
Project-URL: Documentation, https://flower.ai
|
52
52
|
Project-URL: Repository, https://github.com/adap/flower
|
53
53
|
Description-Content-Type: text/markdown
|
@@ -88,7 +88,7 @@ design of Flower is based on a few guiding principles:
|
|
88
88
|
|
89
89
|
- **Framework-agnostic**: Different machine learning frameworks have different
|
90
90
|
strengths. Flower can be used with any machine learning framework, for
|
91
|
-
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
91
|
+
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
92
92
|
for users who enjoy computing gradients by hand.
|
93
93
|
|
94
94
|
- **Understandable**: Flower is written with maintainability in mind. The
|
@@ -34,7 +34,7 @@ design of Flower is based on a few guiding principles:
|
|
34
34
|
|
35
35
|
- **Framework-agnostic**: Different machine learning frameworks have different
|
36
36
|
strengths. Flower can be used with any machine learning framework, for
|
37
|
-
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
37
|
+
example, [PyTorch](https://pytorch.org), [TensorFlow](https://tensorflow.org), [Hugging Face Transformers](https://huggingface.co/), [PyTorch Lightning](https://pytorchlightning.ai/), [scikit-learn](https://scikit-learn.org/), [JAX](https://jax.readthedocs.io/), [TFLite](https://tensorflow.org/lite/), [MONAI](https://docs.monai.io/en/latest/index.html), [fastai](https://www.fast.ai/), [MLX](https://ml-explore.github.io/mlx/build/html/index.html), [XGBoost](https://xgboost.readthedocs.io/en/stable/), [LeRobot](https://github.com/huggingface/lerobot) for federated robots, [Pandas](https://pandas.pydata.org/) for federated analytics, or even raw [NumPy](https://numpy.org/)
|
38
38
|
for users who enjoy computing gradients by hand.
|
39
39
|
|
40
40
|
- **Understandable**: Flower is written with maintainability in mind. The
|
@@ -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.dev20250112"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
@@ -83,8 +83,8 @@ requests = "^2.31.0"
|
|
83
83
|
# Optional dependencies (Simulation Engine)
|
84
84
|
ray = { version = "==2.10.0", optional = true, python = ">=3.9,<3.12" }
|
85
85
|
# Optional dependencies (REST transport layer)
|
86
|
-
starlette = { version = "^0.
|
87
|
-
uvicorn = { version = "^0.
|
86
|
+
starlette = { version = "^0.45.2", optional = true }
|
87
|
+
uvicorn = { version = "^0.34.0", extras = ["standard"], optional = true }
|
88
88
|
|
89
89
|
[tool.poetry.extras]
|
90
90
|
simulation = ["ray"]
|
@@ -54,8 +54,12 @@ class CliUserAuthInterceptor(
|
|
54
54
|
|
55
55
|
response = continuation(details, request)
|
56
56
|
if response.initial_metadata():
|
57
|
-
|
58
|
-
|
57
|
+
credentials = self.auth_plugin.read_tokens_from_metadata(
|
58
|
+
response.initial_metadata()
|
59
|
+
)
|
60
|
+
# The metadata contains tokens only if they have been refreshed
|
61
|
+
if credentials is not None:
|
62
|
+
self.auth_plugin.store_tokens(credentials)
|
59
63
|
|
60
64
|
return response
|
61
65
|
|
{flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/login/login.py
RENAMED
@@ -26,7 +26,7 @@ from flwr.cli.config_utils import (
|
|
26
26
|
process_loaded_project_config,
|
27
27
|
validate_federation_in_project_config,
|
28
28
|
)
|
29
|
-
from flwr.common.
|
29
|
+
from flwr.common.typing import UserAuthLoginDetails
|
30
30
|
from flwr.proto.exec_pb2 import ( # pylint: disable=E0611
|
31
31
|
GetLoginDetailsRequest,
|
32
32
|
GetLoginDetailsResponse,
|
@@ -64,7 +64,7 @@ def login( # pylint: disable=R0914
|
|
64
64
|
login_response: GetLoginDetailsResponse = stub.GetLoginDetails(login_request)
|
65
65
|
|
66
66
|
# Get the auth plugin
|
67
|
-
auth_type = login_response.
|
67
|
+
auth_type = login_response.auth_type
|
68
68
|
auth_plugin = try_obtain_cli_auth_plugin(app, federation, auth_type)
|
69
69
|
if auth_plugin is None:
|
70
70
|
typer.secho(
|
@@ -75,7 +75,14 @@ def login( # pylint: disable=R0914
|
|
75
75
|
raise typer.Exit(code=1)
|
76
76
|
|
77
77
|
# Login
|
78
|
-
|
78
|
+
details = UserAuthLoginDetails(
|
79
|
+
auth_type=login_response.auth_type,
|
80
|
+
device_code=login_response.device_code,
|
81
|
+
verification_uri_complete=login_response.verification_uri_complete,
|
82
|
+
expires_in=login_response.expires_in,
|
83
|
+
interval=login_response.interval,
|
84
|
+
)
|
85
|
+
credentials = auth_plugin.login(details, stub)
|
79
86
|
|
80
87
|
# Store the tokens
|
81
|
-
auth_plugin.store_tokens(
|
88
|
+
auth_plugin.store_tokens(credentials)
|
{flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/cli/utils.py
RENAMED
@@ -223,19 +223,19 @@ def try_obtain_cli_auth_plugin(
|
|
223
223
|
config_path = get_user_auth_config_path(root_dir, federation)
|
224
224
|
|
225
225
|
# Load the config file if it exists
|
226
|
-
|
226
|
+
json_file: dict[str, Any] = {}
|
227
227
|
if config_path.exists():
|
228
228
|
with config_path.open("r", encoding="utf-8") as file:
|
229
|
-
|
229
|
+
json_file = json.load(file)
|
230
230
|
# This is the case when the user auth is not enabled
|
231
231
|
elif auth_type is None:
|
232
232
|
return None
|
233
233
|
|
234
234
|
# Get the auth type from the config if not provided
|
235
235
|
if auth_type is None:
|
236
|
-
if AUTH_TYPE not in
|
236
|
+
if AUTH_TYPE not in json_file:
|
237
237
|
return None
|
238
|
-
auth_type =
|
238
|
+
auth_type = json_file[AUTH_TYPE]
|
239
239
|
|
240
240
|
# Retrieve auth plugin class and instantiate it
|
241
241
|
try:
|
{flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/client/app.py
RENAMED
@@ -15,13 +15,14 @@
|
|
15
15
|
"""Flower client app."""
|
16
16
|
|
17
17
|
|
18
|
+
import multiprocessing
|
18
19
|
import signal
|
19
|
-
import subprocess
|
20
20
|
import sys
|
21
21
|
import time
|
22
22
|
from contextlib import AbstractContextManager
|
23
23
|
from dataclasses import dataclass
|
24
24
|
from logging import ERROR, INFO, WARN
|
25
|
+
from os import urandom
|
25
26
|
from pathlib import Path
|
26
27
|
from typing import Callable, Optional, Union, cast
|
27
28
|
|
@@ -33,6 +34,7 @@ from flwr.cli.config_utils import get_fab_metadata
|
|
33
34
|
from flwr.cli.install import install_from_fab
|
34
35
|
from flwr.client.client import Client
|
35
36
|
from flwr.client.client_app import ClientApp, LoadClientAppError
|
37
|
+
from flwr.client.clientapp.app import flwr_clientapp
|
36
38
|
from flwr.client.nodestate.nodestate_factory import NodeStateFactory
|
37
39
|
from flwr.client.typing import ClientFnExt
|
38
40
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
|
@@ -53,13 +55,12 @@ from flwr.common.constant import (
|
|
53
55
|
TRANSPORT_TYPES,
|
54
56
|
ErrorCode,
|
55
57
|
)
|
58
|
+
from flwr.common.grpc import generic_create_grpc_server
|
56
59
|
from flwr.common.logger import log, warn_deprecated_feature
|
57
60
|
from flwr.common.message import Error
|
58
61
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
59
62
|
from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
|
60
63
|
from flwr.proto.clientappio_pb2_grpc import add_ClientAppIoServicer_to_server
|
61
|
-
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import generic_create_grpc_server
|
62
|
-
from flwr.server.superlink.linkstate.utils import generate_rand_int_from_bytes
|
63
64
|
|
64
65
|
from .clientapp.clientappio_servicer import ClientAppInputs, ClientAppIoServicer
|
65
66
|
from .grpc_adapter_client.connection import grpc_adapter
|
@@ -391,6 +392,7 @@ def start_client_internal(
|
|
391
392
|
run_info_store: Optional[DeprecatedRunInfoStore] = None
|
392
393
|
state_factory = NodeStateFactory()
|
393
394
|
state = state_factory.state()
|
395
|
+
mp_spawn_context = multiprocessing.get_context("spawn")
|
394
396
|
|
395
397
|
runs: dict[int, Run] = {}
|
396
398
|
|
@@ -513,7 +515,7 @@ def start_client_internal(
|
|
513
515
|
# Docker container.
|
514
516
|
|
515
517
|
# Generate SuperNode token
|
516
|
-
token
|
518
|
+
token = int.from_bytes(urandom(RUN_ID_NUM_BYTES), "little")
|
517
519
|
|
518
520
|
# Mode 1: SuperNode starts ClientApp as subprocess
|
519
521
|
start_subprocess = isolation == ISOLATION_MODE_SUBPROCESS
|
@@ -549,12 +551,13 @@ def start_client_internal(
|
|
549
551
|
]
|
550
552
|
command.append("--insecure")
|
551
553
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
check=True,
|
554
|
+
proc = mp_spawn_context.Process(
|
555
|
+
target=_run_flwr_clientapp,
|
556
|
+
args=(command,),
|
557
|
+
daemon=True,
|
557
558
|
)
|
559
|
+
proc.start()
|
560
|
+
proc.join()
|
558
561
|
else:
|
559
562
|
# Wait for output to become available
|
560
563
|
while not clientappio_servicer.has_outputs():
|
@@ -826,6 +829,11 @@ class _AppStateTracker:
|
|
826
829
|
signal.signal(signal.SIGTERM, signal_handler)
|
827
830
|
|
828
831
|
|
832
|
+
def _run_flwr_clientapp(args: list[str]) -> None:
|
833
|
+
sys.argv = args
|
834
|
+
flwr_clientapp()
|
835
|
+
|
836
|
+
|
829
837
|
def run_clientappio_api_grpc(
|
830
838
|
address: str,
|
831
839
|
certificates: Optional[tuple[bytes, bytes, bytes]],
|
@@ -36,7 +36,9 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
36
36
|
CreateNodeRequest,
|
37
37
|
DeleteNodeRequest,
|
38
38
|
PingRequest,
|
39
|
+
PullMessagesRequest,
|
39
40
|
PullTaskInsRequest,
|
41
|
+
PushMessagesRequest,
|
40
42
|
PushTaskResRequest,
|
41
43
|
)
|
42
44
|
from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
|
@@ -52,6 +54,8 @@ Request = Union[
|
|
52
54
|
GetRunRequest,
|
53
55
|
PingRequest,
|
54
56
|
GetFabRequest,
|
57
|
+
PullMessagesRequest,
|
58
|
+
PushMessagesRequest,
|
55
59
|
]
|
56
60
|
|
57
61
|
|
@@ -129,6 +133,8 @@ class AuthenticateClientInterceptor(grpc.UnaryUnaryClientInterceptor): # type:
|
|
129
133
|
GetRunRequest,
|
130
134
|
PingRequest,
|
131
135
|
GetFabRequest,
|
136
|
+
PullMessagesRequest,
|
137
|
+
PushMessagesRequest,
|
132
138
|
),
|
133
139
|
):
|
134
140
|
if self.shared_secret is None:
|
@@ -40,8 +40,12 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
40
40
|
DeleteNodeResponse,
|
41
41
|
PingRequest,
|
42
42
|
PingResponse,
|
43
|
+
PullMessagesRequest,
|
44
|
+
PullMessagesResponse,
|
43
45
|
PullTaskInsRequest,
|
44
46
|
PullTaskInsResponse,
|
47
|
+
PushMessagesRequest,
|
48
|
+
PushMessagesResponse,
|
45
49
|
PushTaskResRequest,
|
46
50
|
PushTaskResResponse,
|
47
51
|
)
|
@@ -132,12 +136,24 @@ class GrpcAdapter:
|
|
132
136
|
"""."""
|
133
137
|
return self._send_and_receive(request, PullTaskInsResponse, **kwargs)
|
134
138
|
|
139
|
+
def PullMessages( # pylint: disable=C0103
|
140
|
+
self, request: PullMessagesRequest, **kwargs: Any
|
141
|
+
) -> PullMessagesResponse:
|
142
|
+
"""."""
|
143
|
+
return self._send_and_receive(request, PullMessagesResponse, **kwargs)
|
144
|
+
|
135
145
|
def PushTaskRes( # pylint: disable=C0103
|
136
146
|
self, request: PushTaskResRequest, **kwargs: Any
|
137
147
|
) -> PushTaskResResponse:
|
138
148
|
"""."""
|
139
149
|
return self._send_and_receive(request, PushTaskResResponse, **kwargs)
|
140
150
|
|
151
|
+
def PushMessages( # pylint: disable=C0103
|
152
|
+
self, request: PushMessagesRequest, **kwargs: Any
|
153
|
+
) -> PushMessagesResponse:
|
154
|
+
"""."""
|
155
|
+
return self._send_and_receive(request, PushMessagesResponse, **kwargs)
|
156
|
+
|
141
157
|
def GetRun( # pylint: disable=C0103
|
142
158
|
self, request: GetRunRequest, **kwargs: Any
|
143
159
|
) -> GetRunResponse:
|
@@ -18,26 +18,31 @@
|
|
18
18
|
from abc import ABC, abstractmethod
|
19
19
|
from collections.abc import Sequence
|
20
20
|
from pathlib import Path
|
21
|
-
from typing import
|
21
|
+
from typing import Optional, Union
|
22
22
|
|
23
23
|
from flwr.proto.exec_pb2_grpc import ExecStub
|
24
24
|
|
25
|
+
from ..typing import UserAuthCredentials, UserAuthLoginDetails
|
26
|
+
|
25
27
|
|
26
28
|
class ExecAuthPlugin(ABC):
|
27
29
|
"""Abstract Flower Auth Plugin class for ExecServicer.
|
28
30
|
|
29
31
|
Parameters
|
30
32
|
----------
|
31
|
-
|
32
|
-
|
33
|
+
user_auth_config_path : Path
|
34
|
+
Path to the YAML file containing the authentication configuration.
|
33
35
|
"""
|
34
36
|
|
35
37
|
@abstractmethod
|
36
|
-
def __init__(
|
38
|
+
def __init__(
|
39
|
+
self,
|
40
|
+
user_auth_config_path: Path,
|
41
|
+
):
|
37
42
|
"""Abstract constructor."""
|
38
43
|
|
39
44
|
@abstractmethod
|
40
|
-
def get_login_details(self) ->
|
45
|
+
def get_login_details(self) -> Optional[UserAuthLoginDetails]:
|
41
46
|
"""Get the login details."""
|
42
47
|
|
43
48
|
@abstractmethod
|
@@ -47,7 +52,7 @@ class ExecAuthPlugin(ABC):
|
|
47
52
|
"""Validate authentication tokens in the provided metadata."""
|
48
53
|
|
49
54
|
@abstractmethod
|
50
|
-
def get_auth_tokens(self,
|
55
|
+
def get_auth_tokens(self, device_code: str) -> Optional[UserAuthCredentials]:
|
51
56
|
"""Get authentication tokens."""
|
52
57
|
|
53
58
|
@abstractmethod
|
@@ -62,50 +67,55 @@ class CliAuthPlugin(ABC):
|
|
62
67
|
|
63
68
|
Parameters
|
64
69
|
----------
|
65
|
-
|
66
|
-
|
70
|
+
credentials_path : Path
|
71
|
+
Path to the user's authentication credentials file.
|
67
72
|
"""
|
68
73
|
|
69
74
|
@staticmethod
|
70
75
|
@abstractmethod
|
71
76
|
def login(
|
72
|
-
login_details:
|
77
|
+
login_details: UserAuthLoginDetails,
|
73
78
|
exec_stub: ExecStub,
|
74
|
-
) ->
|
75
|
-
"""Authenticate the user
|
79
|
+
) -> UserAuthCredentials:
|
80
|
+
"""Authenticate the user and retrieve authentication credentials.
|
76
81
|
|
77
82
|
Parameters
|
78
83
|
----------
|
79
|
-
login_details :
|
80
|
-
|
84
|
+
login_details : UserAuthLoginDetails
|
85
|
+
An object containing the user's login details.
|
81
86
|
exec_stub : ExecStub
|
82
|
-
|
87
|
+
A stub for executing RPC calls to the server.
|
83
88
|
|
84
89
|
Returns
|
85
90
|
-------
|
86
|
-
|
87
|
-
|
88
|
-
in JSON format.
|
91
|
+
UserAuthCredentials
|
92
|
+
The authentication credentials obtained after login.
|
89
93
|
"""
|
90
94
|
|
91
95
|
@abstractmethod
|
92
|
-
def __init__(self,
|
96
|
+
def __init__(self, credentials_path: Path):
|
93
97
|
"""Abstract constructor."""
|
94
98
|
|
95
99
|
@abstractmethod
|
96
|
-
def store_tokens(self,
|
97
|
-
"""Store authentication tokens
|
100
|
+
def store_tokens(self, credentials: UserAuthCredentials) -> None:
|
101
|
+
"""Store authentication tokens to the `credentials_path`.
|
98
102
|
|
99
|
-
The
|
100
|
-
at `
|
103
|
+
The credentials, including tokens, will be saved as a JSON file
|
104
|
+
at `credentials_path`.
|
101
105
|
"""
|
102
106
|
|
103
107
|
@abstractmethod
|
104
108
|
def load_tokens(self) -> None:
|
105
|
-
"""Load authentication tokens from the
|
109
|
+
"""Load authentication tokens from the `credentials_path`."""
|
106
110
|
|
107
111
|
@abstractmethod
|
108
112
|
def write_tokens_to_metadata(
|
109
113
|
self, metadata: Sequence[tuple[str, Union[str, bytes]]]
|
110
114
|
) -> Sequence[tuple[str, Union[str, bytes]]]:
|
111
115
|
"""Write authentication tokens to the provided metadata."""
|
116
|
+
|
117
|
+
@abstractmethod
|
118
|
+
def read_tokens_from_metadata(
|
119
|
+
self, metadata: Sequence[tuple[str, Union[str, bytes]]]
|
120
|
+
) -> Optional[UserAuthCredentials]:
|
121
|
+
"""Read authentication tokens from the provided metadata."""
|
{flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/constant.py
RENAMED
@@ -114,6 +114,8 @@ MAX_RETRY_DELAY = 20 # Maximum delay duration between two consecutive retries.
|
|
114
114
|
# Constants for user authentication
|
115
115
|
CREDENTIALS_DIR = ".credentials"
|
116
116
|
AUTH_TYPE = "auth_type"
|
117
|
+
ACCESS_TOKEN_KEY = "access_token"
|
118
|
+
REFRESH_TOKEN_KEY = "refresh_token"
|
117
119
|
|
118
120
|
|
119
121
|
class MessageType:
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright
|
1
|
+
# Copyright 2022 Flower Labs GmbH. All Rights Reserved.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -12,32 +12,21 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
# ==============================================================================
|
15
|
-
"""
|
15
|
+
"""Utility functions for gRPC."""
|
16
16
|
|
17
17
|
|
18
18
|
import concurrent.futures
|
19
19
|
import sys
|
20
20
|
from collections.abc import Sequence
|
21
|
-
from logging import ERROR
|
22
|
-
from typing import Any, Callable, Optional
|
21
|
+
from logging import DEBUG, ERROR
|
22
|
+
from typing import Any, Callable, Optional
|
23
23
|
|
24
24
|
import grpc
|
25
25
|
|
26
|
-
from
|
27
|
-
from
|
28
|
-
|
29
|
-
|
30
|
-
add_FlowerServiceServicer_to_server,
|
31
|
-
)
|
32
|
-
from flwr.server.client_manager import ClientManager
|
33
|
-
from flwr.server.superlink.driver.serverappio_servicer import ServerAppIoServicer
|
34
|
-
from flwr.server.superlink.fleet.grpc_adapter.grpc_adapter_servicer import (
|
35
|
-
GrpcAdapterServicer,
|
36
|
-
)
|
37
|
-
from flwr.server.superlink.fleet.grpc_bidi.flower_service_servicer import (
|
38
|
-
FlowerServiceServicer,
|
39
|
-
)
|
40
|
-
from flwr.server.superlink.fleet.grpc_rere.fleet_servicer import FleetServicer
|
26
|
+
from .address import is_port_in_use
|
27
|
+
from .logger import log
|
28
|
+
|
29
|
+
GRPC_MAX_MESSAGE_LENGTH: int = 536_870_912 # == 512 * 1024 * 1024
|
41
30
|
|
42
31
|
INVALID_CERTIFICATES_ERR_MSG = """
|
43
32
|
When setting any of root_certificate, certificate, or private_key,
|
@@ -47,122 +36,63 @@ INVALID_CERTIFICATES_ERR_MSG = """
|
|
47
36
|
AddServicerToServerFn = Callable[..., Any]
|
48
37
|
|
49
38
|
|
50
|
-
def
|
51
|
-
"""Validate certificates tuple."""
|
52
|
-
is_valid = (
|
53
|
-
all(isinstance(certificate, bytes) for certificate in certificates)
|
54
|
-
and len(certificates) == 3
|
55
|
-
)
|
56
|
-
|
57
|
-
if not is_valid:
|
58
|
-
log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
|
59
|
-
|
60
|
-
return is_valid
|
61
|
-
|
62
|
-
|
63
|
-
def start_grpc_server( # pylint: disable=too-many-arguments,R0917
|
64
|
-
client_manager: ClientManager,
|
39
|
+
def create_channel(
|
65
40
|
server_address: str,
|
66
|
-
|
41
|
+
insecure: bool,
|
42
|
+
root_certificates: Optional[bytes] = None,
|
67
43
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
and private_key. Setting only some will make the process exit with code 1.
|
79
|
-
|
80
|
-
Parameters
|
81
|
-
----------
|
82
|
-
client_manager : ClientManager
|
83
|
-
Instance of ClientManager
|
84
|
-
server_address : str
|
85
|
-
Server address in the form of HOST:PORT e.g. "[::]:8080"
|
86
|
-
max_concurrent_workers : int
|
87
|
-
Maximum number of clients the server can process before returning
|
88
|
-
RESOURCE_EXHAUSTED status (default: 1000)
|
89
|
-
max_message_length : int
|
90
|
-
Maximum message length that the server can send or receive.
|
91
|
-
Int valued in bytes. -1 means unlimited. (default: GRPC_MAX_MESSAGE_LENGTH)
|
92
|
-
keepalive_time_ms : int
|
93
|
-
Flower uses a default gRPC keepalive time of 210000ms (3 minutes 30 seconds)
|
94
|
-
because some cloud providers (for example, Azure) agressively clean up idle
|
95
|
-
TCP connections by terminating them after some time (4 minutes in the case
|
96
|
-
of Azure). Flower does not use application-level keepalive signals and relies
|
97
|
-
on the assumption that the transport layer will fail in cases where the
|
98
|
-
connection is no longer active. `keepalive_time_ms` can be used to customize
|
99
|
-
the keepalive interval for specific environments. The default Flower gRPC
|
100
|
-
keepalive of 210000 ms (3 minutes 30 seconds) ensures that Flower can keep
|
101
|
-
the long running streaming connection alive in most environments. The actual
|
102
|
-
gRPC default of this setting is 7200000 (2 hours), which results in dropped
|
103
|
-
connections in some cloud environments.
|
104
|
-
|
105
|
-
These settings are related to the issue described here:
|
106
|
-
- https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md
|
107
|
-
- https://github.com/grpc/grpc/blob/master/doc/keepalive.md
|
108
|
-
- https://grpc.io/docs/guides/performance/
|
44
|
+
interceptors: Optional[Sequence[grpc.UnaryUnaryClientInterceptor]] = None,
|
45
|
+
) -> grpc.Channel:
|
46
|
+
"""Create a gRPC channel, either secure or insecure."""
|
47
|
+
# Check for conflicting parameters
|
48
|
+
if insecure and root_certificates is not None:
|
49
|
+
raise ValueError(
|
50
|
+
"Invalid configuration: 'root_certificates' should not be provided "
|
51
|
+
"when 'insecure' is set to True. For an insecure connection, omit "
|
52
|
+
"'root_certificates', or set 'insecure' to False for a secure connection."
|
53
|
+
)
|
109
54
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
elements in the following order:
|
55
|
+
# Possible options:
|
56
|
+
# https://github.com/grpc/grpc/blob/v1.43.x/include/grpc/impl/codegen/grpc_types.h
|
57
|
+
channel_options = [
|
58
|
+
("grpc.max_send_message_length", max_message_length),
|
59
|
+
("grpc.max_receive_message_length", max_message_length),
|
60
|
+
]
|
117
61
|
|
118
|
-
|
119
|
-
|
120
|
-
|
62
|
+
if insecure:
|
63
|
+
channel = grpc.insecure_channel(server_address, options=channel_options)
|
64
|
+
log(DEBUG, "Opened insecure gRPC connection (no certificates were passed)")
|
65
|
+
else:
|
66
|
+
try:
|
67
|
+
ssl_channel_credentials = grpc.ssl_channel_credentials(root_certificates)
|
68
|
+
except Exception as e:
|
69
|
+
raise ValueError(f"Failed to create SSL channel credentials: {e}") from e
|
70
|
+
channel = grpc.secure_channel(
|
71
|
+
server_address, ssl_channel_credentials, options=channel_options
|
72
|
+
)
|
73
|
+
log(DEBUG, "Opened secure gRPC connection using certificates")
|
121
74
|
|
122
|
-
|
123
|
-
|
124
|
-
server : grpc.Server
|
125
|
-
An instance of a gRPC server which is already started
|
75
|
+
if interceptors is not None:
|
76
|
+
channel = grpc.intercept_channel(channel, interceptors)
|
126
77
|
|
127
|
-
|
128
|
-
--------
|
129
|
-
Starting a SSL-enabled server.
|
78
|
+
return channel
|
130
79
|
|
131
|
-
>>> from pathlib import Path
|
132
|
-
>>> start_grpc_server(
|
133
|
-
>>> client_manager=ClientManager(),
|
134
|
-
>>> server_address="localhost:8080",
|
135
|
-
>>> certificates=(
|
136
|
-
>>> Path("/crts/root.pem").read_bytes(),
|
137
|
-
>>> Path("/crts/localhost.crt").read_bytes(),
|
138
|
-
>>> Path("/crts/localhost.key").read_bytes(),
|
139
|
-
>>> ),
|
140
|
-
>>> )
|
141
|
-
"""
|
142
|
-
servicer = FlowerServiceServicer(client_manager)
|
143
|
-
add_servicer_to_server_fn = add_FlowerServiceServicer_to_server
|
144
80
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
keepalive_time_ms=keepalive_time_ms,
|
151
|
-
certificates=certificates,
|
81
|
+
def valid_certificates(certificates: tuple[bytes, bytes, bytes]) -> bool:
|
82
|
+
"""Validate certificates tuple."""
|
83
|
+
is_valid = (
|
84
|
+
all(isinstance(certificate, bytes) for certificate in certificates)
|
85
|
+
and len(certificates) == 3
|
152
86
|
)
|
153
87
|
|
154
|
-
|
88
|
+
if not is_valid:
|
89
|
+
log(ERROR, INVALID_CERTIFICATES_ERR_MSG)
|
155
90
|
|
156
|
-
return
|
91
|
+
return is_valid
|
157
92
|
|
158
93
|
|
159
94
|
def generic_create_grpc_server( # pylint: disable=too-many-arguments,R0917
|
160
|
-
servicer_and_add_fn:
|
161
|
-
tuple[FleetServicer, AddServicerToServerFn],
|
162
|
-
tuple[GrpcAdapterServicer, AddServicerToServerFn],
|
163
|
-
tuple[FlowerServiceServicer, AddServicerToServerFn],
|
164
|
-
tuple[ServerAppIoServicer, AddServicerToServerFn],
|
165
|
-
],
|
95
|
+
servicer_and_add_fn: tuple[Any, AddServicerToServerFn],
|
166
96
|
server_address: str,
|
167
97
|
max_concurrent_workers: int = 1000,
|
168
98
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
{flwr_nightly-1.15.0.dev20250107 → flwr_nightly-1.15.0.dev20250112}/src/py/flwr/common/typing.py
RENAMED
@@ -266,3 +266,23 @@ class InvalidRunStatusException(BaseException):
|
|
266
266
|
def __init__(self, message: str) -> None:
|
267
267
|
super().__init__(message)
|
268
268
|
self.message = message
|
269
|
+
|
270
|
+
|
271
|
+
# OIDC user authentication types
|
272
|
+
@dataclass
|
273
|
+
class UserAuthLoginDetails:
|
274
|
+
"""User authentication login details."""
|
275
|
+
|
276
|
+
auth_type: str
|
277
|
+
device_code: str
|
278
|
+
verification_uri_complete: str
|
279
|
+
expires_in: int
|
280
|
+
interval: int
|
281
|
+
|
282
|
+
|
283
|
+
@dataclass
|
284
|
+
class UserAuthCredentials:
|
285
|
+
"""User authentication tokens."""
|
286
|
+
|
287
|
+
access_token: str
|
288
|
+
refresh_token: str
|