flwr-nightly 1.15.0.dev20250118__tar.gz → 1.15.0.dev20250120__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.dev20250118 → flwr_nightly-1.15.0.dev20250120}/PKG-INFO +1 -1
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/pyproject.toml +1 -1
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/app.py +7 -7
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/app.py +4 -6
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/rest_client/connection.py +2 -3
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/supernode/app.py +9 -15
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/auth_plugin/auth_plugin.py +1 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/constant.py +0 -8
- flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/__init__.py +24 -0
- flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/exit.py +99 -0
- flwr_nightly-1.15.0.dev20250120/src/py/flwr/common/exit/exit_code.py +90 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/exit_handlers.py +24 -10
- flwr_nightly-1.15.0.dev20250120/src/py/flwr/proto/serverappio_pb2.py +70 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2.pyi +56 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2_grpc.py +86 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/serverappio_pb2_grpc.pyi +20 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/app.py +20 -9
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp/app.py +4 -6
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/serverappio_servicer.py +109 -3
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +2 -3
- flwr_nightly-1.15.0.dev20250118/src/py/flwr/proto/serverappio_pb2.py +0 -62
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/LICENSE +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/README.md +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/build.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/cli_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/config_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/example.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/install.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/log.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/login/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/login/login.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/ls.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/new.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/.gitignore.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/LICENSE.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.baseline.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.flowertune.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/dataset.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/models.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/server_app.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/flwr_tune/strategy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/model.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/strategy.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.huggingface.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.jax.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.mlx.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.numpy.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.sklearn.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/task.tensorflow.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/code/utils.baseline.py.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.jax.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/run/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/run/run.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/stop.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/cli/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/client.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/client_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/clientappio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/clientapp/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_adapter_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_adapter_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/client_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/grpc_rere_client/grpc_adapter.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/heartbeat.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/message_handler/task_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/comms_mods.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/localdp_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/mod/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/in_memory_nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/nodestate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/nodestate/nodestate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/numpy_client.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/rest_client/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/run_info_store.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/supernode/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/address.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/args.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/auth_plugin/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/config.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/context.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/date.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/differential_privacy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/differential_privacy_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/dp.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/logger.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/message.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/object_ref.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/parameter.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/pyproject.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/configsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/conversion_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/metricsrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/parametersrecord.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/recordset.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/record/typeddict.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/recordset_compat.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/retry_invoker.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/serde.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/telemetry.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/version.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/clientappio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/exec_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fab_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/fleet_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/grpcadapter_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/log_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/message_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/run_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/simulationio_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/py.typed +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/client_manager.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/app_utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/driver_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/compat/legacy_context.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/criterion.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/grpc_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/driver/inmemory_driver.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/history.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/run_serverapp.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/server_config.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/serverapp_components.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/aggregate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/bulyan.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedadam.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedavgm.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedmedian.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedopt.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedprox.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/fedyogi.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/krum.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/qfedavg.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/strategy/strategy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/driver/serverappio_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/disk_ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/ffs.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/ffs/ffs_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_adapter/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/in_memory_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/linkstate_factory.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/sqlite_linkstate.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/linkstate/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/simulationio_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/simulation/simulationio_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/superlink/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/typing.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/tensorboard.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/utils/validator.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/constant.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/default_workflows.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/legacy_app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/run_simulation.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/simulation/simulationio_connection.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/__init__.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/app.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/deployment.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_grpc.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_servicer.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/exec_user_auth_interceptor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/superexec/executor.py +0 -0
- {flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/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.dev20250120"
|
8
8
|
description = "Flower: A Friendly Federated AI Framework"
|
9
9
|
license = "Apache-2.0"
|
10
10
|
authors = ["The Flower Authors <hello@flower.ai>"]
|
{flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/client/app.py
RENAMED
@@ -45,7 +45,6 @@ from flwr.common.constant import (
|
|
45
45
|
ISOLATION_MODE_PROCESS,
|
46
46
|
ISOLATION_MODE_SUBPROCESS,
|
47
47
|
MAX_RETRY_DELAY,
|
48
|
-
MISSING_EXTRA_REST,
|
49
48
|
RUN_ID_NUM_BYTES,
|
50
49
|
SERVER_OCTET,
|
51
50
|
TRANSPORT_TYPE_GRPC_ADAPTER,
|
@@ -55,6 +54,7 @@ from flwr.common.constant import (
|
|
55
54
|
TRANSPORT_TYPES,
|
56
55
|
ErrorCode,
|
57
56
|
)
|
57
|
+
from flwr.common.exit import ExitCode, flwr_exit
|
58
58
|
from flwr.common.grpc import generic_create_grpc_server
|
59
59
|
from flwr.common.logger import log, warn_deprecated_feature
|
60
60
|
from flwr.common.message import Error
|
@@ -763,7 +763,10 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
|
|
763
763
|
# Parse IP address
|
764
764
|
parsed_address = parse_address(server_address)
|
765
765
|
if not parsed_address:
|
766
|
-
|
766
|
+
flwr_exit(
|
767
|
+
ExitCode.COMMON_ADDRESS_INVALID,
|
768
|
+
f"SuperLink address ({server_address}) cannot be parsed.",
|
769
|
+
)
|
767
770
|
host, port, is_v6 = parsed_address
|
768
771
|
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
769
772
|
|
@@ -778,12 +781,9 @@ def _init_connection(transport: Optional[str], server_address: str) -> tuple[
|
|
778
781
|
|
779
782
|
from .rest_client.connection import http_request_response
|
780
783
|
except ModuleNotFoundError:
|
781
|
-
|
784
|
+
flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
|
782
785
|
if server_address[:4] != "http":
|
783
|
-
|
784
|
-
"When using the REST API, please provide `https://` or "
|
785
|
-
"`http://` before the server address (e.g. `http://127.0.0.1:8080`)"
|
786
|
-
)
|
786
|
+
flwr_exit(ExitCode.SUPERNODE_REST_ADDRESS_INVALID)
|
787
787
|
connection, error_type = http_request_response, RequestsConnectionError
|
788
788
|
elif transport == TRANSPORT_TYPE_GRPC_RERE:
|
789
789
|
connection, error_type = grpc_request_response, RpcError
|
@@ -16,7 +16,6 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import argparse
|
19
|
-
import sys
|
20
19
|
import time
|
21
20
|
from logging import DEBUG, ERROR, INFO
|
22
21
|
from typing import Optional
|
@@ -29,6 +28,7 @@ from flwr.common import Context, Message
|
|
29
28
|
from flwr.common.args import add_args_flwr_app_common
|
30
29
|
from flwr.common.config import get_flwr_dir
|
31
30
|
from flwr.common.constant import CLIENTAPPIO_API_DEFAULT_CLIENT_ADDRESS, ErrorCode
|
31
|
+
from flwr.common.exit import ExitCode, flwr_exit
|
32
32
|
from flwr.common.grpc import create_channel
|
33
33
|
from flwr.common.logger import log
|
34
34
|
from flwr.common.message import Error
|
@@ -61,12 +61,10 @@ def flwr_clientapp() -> None:
|
|
61
61
|
"""Run process-isolated Flower ClientApp."""
|
62
62
|
args = _parse_args_run_flwr_clientapp().parse_args()
|
63
63
|
if not args.insecure:
|
64
|
-
|
65
|
-
|
66
|
-
"flwr-clientapp does not support TLS yet.
|
67
|
-
"Please use the '--insecure' flag.",
|
64
|
+
flwr_exit(
|
65
|
+
ExitCode.COMMON_TLS_NOT_SUPPORTED,
|
66
|
+
"flwr-clientapp does not support TLS yet.",
|
68
67
|
)
|
69
|
-
sys.exit(1)
|
70
68
|
|
71
69
|
log(INFO, "Starting Flower ClientApp")
|
72
70
|
log(
|
@@ -16,7 +16,6 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
import random
|
19
|
-
import sys
|
20
19
|
import threading
|
21
20
|
from collections.abc import Iterator
|
22
21
|
from contextlib import contextmanager
|
@@ -32,12 +31,12 @@ from flwr.client.heartbeat import start_ping_loop
|
|
32
31
|
from flwr.client.message_handler.message_handler import validate_out_message
|
33
32
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH
|
34
33
|
from flwr.common.constant import (
|
35
|
-
MISSING_EXTRA_REST,
|
36
34
|
PING_BASE_MULTIPLIER,
|
37
35
|
PING_CALL_TIMEOUT,
|
38
36
|
PING_DEFAULT_INTERVAL,
|
39
37
|
PING_RANDOM_RANGE,
|
40
38
|
)
|
39
|
+
from flwr.common.exit import ExitCode, flwr_exit
|
41
40
|
from flwr.common.logger import log
|
42
41
|
from flwr.common.message import Message, Metadata
|
43
42
|
from flwr.common.retry_invoker import RetryInvoker
|
@@ -62,7 +61,7 @@ from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=
|
|
62
61
|
try:
|
63
62
|
import requests
|
64
63
|
except ModuleNotFoundError:
|
65
|
-
|
64
|
+
flwr_exit(ExitCode.COMMON_MISSING_EXTRA_REST)
|
66
65
|
|
67
66
|
|
68
67
|
PATH_CREATE_NODE: str = "api/v0/fleet/create-node"
|
@@ -40,6 +40,7 @@ from flwr.common.constant import (
|
|
40
40
|
TRANSPORT_TYPE_GRPC_RERE,
|
41
41
|
TRANSPORT_TYPE_REST,
|
42
42
|
)
|
43
|
+
from flwr.common.exit import ExitCode, flwr_exit
|
43
44
|
from flwr.common.exit_handlers import register_exit_handlers
|
44
45
|
from flwr.common.logger import log, warn_deprecated_feature
|
45
46
|
|
@@ -89,6 +90,7 @@ def run_supernode() -> None:
|
|
89
90
|
# Register handlers for graceful shutdown
|
90
91
|
register_exit_handlers(
|
91
92
|
event_type=EventType.RUN_SUPERNODE_LEAVE,
|
93
|
+
exit_message="SuperNode terminated gracefully.",
|
92
94
|
)
|
93
95
|
|
94
96
|
start_client_internal(
|
@@ -280,11 +282,7 @@ def _try_setup_client_authentication(
|
|
280
282
|
return None
|
281
283
|
|
282
284
|
if not args.auth_supernode_private_key or not args.auth_supernode_public_key:
|
283
|
-
|
284
|
-
"Authentication requires file paths to both "
|
285
|
-
"'--auth-supernode-private-key' and '--auth-supernode-public-key'"
|
286
|
-
"to be provided (providing only one of them is not sufficient)."
|
287
|
-
)
|
285
|
+
flwr_exit(ExitCode.SUPERNODE_NODE_AUTH_KEYS_REQUIRED)
|
288
286
|
|
289
287
|
try:
|
290
288
|
ssh_private_key = load_ssh_private_key(
|
@@ -294,11 +292,9 @@ def _try_setup_client_authentication(
|
|
294
292
|
if not isinstance(ssh_private_key, ec.EllipticCurvePrivateKey):
|
295
293
|
raise ValueError()
|
296
294
|
except (ValueError, UnsupportedAlgorithm):
|
297
|
-
|
298
|
-
|
299
|
-
"
|
300
|
-
"curve private and public key pair. Please ensure that the file "
|
301
|
-
"path points to a valid private key file and try again."
|
295
|
+
flwr_exit(
|
296
|
+
ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID,
|
297
|
+
"Unable to parse the private key file.",
|
302
298
|
)
|
303
299
|
|
304
300
|
try:
|
@@ -308,11 +304,9 @@ def _try_setup_client_authentication(
|
|
308
304
|
if not isinstance(ssh_public_key, ec.EllipticCurvePublicKey):
|
309
305
|
raise ValueError()
|
310
306
|
except (ValueError, UnsupportedAlgorithm):
|
311
|
-
|
312
|
-
|
313
|
-
"
|
314
|
-
"curve private and public key pair. Please ensure that the file "
|
315
|
-
"path points to a valid public key file and try again."
|
307
|
+
flwr_exit(
|
308
|
+
ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID,
|
309
|
+
"Unable to parse the public key file.",
|
316
310
|
)
|
317
311
|
|
318
312
|
return (
|
{flwr_nightly-1.15.0.dev20250118 → flwr_nightly-1.15.0.dev20250120}/src/py/flwr/common/constant.py
RENAMED
@@ -17,14 +17,6 @@
|
|
17
17
|
|
18
18
|
from __future__ import annotations
|
19
19
|
|
20
|
-
MISSING_EXTRA_REST = """
|
21
|
-
Extra dependencies required for using the REST-based Fleet API are missing.
|
22
|
-
|
23
|
-
To use the REST API, install `flwr` with the `rest` extra:
|
24
|
-
|
25
|
-
`pip install flwr[rest]`.
|
26
|
-
"""
|
27
|
-
|
28
20
|
TRANSPORT_TYPE_GRPC_BIDI = "grpc-bidi"
|
29
21
|
TRANSPORT_TYPE_GRPC_RERE = "grpc-rere"
|
30
22
|
TRANSPORT_TYPE_GRPC_ADAPTER = "grpc-adapter"
|
@@ -0,0 +1,24 @@
|
|
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 exit functionality."""
|
16
|
+
|
17
|
+
|
18
|
+
from .exit import flwr_exit
|
19
|
+
from .exit_code import ExitCode
|
20
|
+
|
21
|
+
__all__ = [
|
22
|
+
"ExitCode",
|
23
|
+
"flwr_exit",
|
24
|
+
]
|
@@ -0,0 +1,99 @@
|
|
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
|
+
"""Unified exit function."""
|
16
|
+
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
import sys
|
21
|
+
from logging import ERROR, INFO
|
22
|
+
from typing import Any, NoReturn
|
23
|
+
|
24
|
+
from flwr.common import EventType, event
|
25
|
+
|
26
|
+
from ..logger import log
|
27
|
+
from .exit_code import EXIT_CODE_HELP
|
28
|
+
|
29
|
+
HELP_PAGE_URL = "https://flower.ai/docs/framework/ref-exit-codes/"
|
30
|
+
|
31
|
+
|
32
|
+
def flwr_exit(
|
33
|
+
code: int,
|
34
|
+
message: str | None = None,
|
35
|
+
event_type: EventType | None = None,
|
36
|
+
event_details: dict[str, Any] | None = None,
|
37
|
+
) -> NoReturn:
|
38
|
+
"""Handle application exit with an optional message.
|
39
|
+
|
40
|
+
The exit message logged and displayed will follow this structure:
|
41
|
+
|
42
|
+
>>> Exit Code: <code>
|
43
|
+
>>> <message>
|
44
|
+
>>> <short-help-message>
|
45
|
+
>>>
|
46
|
+
>>> For more information, visit: <help-page-url>
|
47
|
+
|
48
|
+
- `<code>`: The unique exit code representing the termination reason.
|
49
|
+
- `<message>`: Optional context or additional information about the exit.
|
50
|
+
- `<short-help-message>`: A brief explanation for the given exit code.
|
51
|
+
- `<help-page-url>`: A URL providing detailed documentation and resolution steps.
|
52
|
+
"""
|
53
|
+
is_error = not 0 <= code < 100 # 0-99 are success exit codes
|
54
|
+
|
55
|
+
# Construct exit message
|
56
|
+
exit_message = f"Exit Code: {code}\n" if is_error else ""
|
57
|
+
exit_message += message or ""
|
58
|
+
if short_help_message := EXIT_CODE_HELP.get(code, ""):
|
59
|
+
exit_message += f"\n{short_help_message}"
|
60
|
+
|
61
|
+
# Set log level and system exit code
|
62
|
+
log_level = ERROR if is_error else INFO
|
63
|
+
sys_exit_code = 1 if is_error else 0
|
64
|
+
|
65
|
+
# Add help URL for non-successful/graceful exits
|
66
|
+
if is_error:
|
67
|
+
help_url = f"{HELP_PAGE_URL}{code}.html"
|
68
|
+
exit_message += f"\n\nFor more information, visit: <{help_url}>"
|
69
|
+
|
70
|
+
# Telemetry event
|
71
|
+
event_type = event_type or _try_obtain_telemetry_event()
|
72
|
+
if event_type:
|
73
|
+
event_details = event_details or {}
|
74
|
+
event_details["exit_code"] = code
|
75
|
+
event(event_type, event_details).result()
|
76
|
+
|
77
|
+
# Log the exit message
|
78
|
+
log(log_level, exit_message)
|
79
|
+
|
80
|
+
# Exit
|
81
|
+
sys.exit(sys_exit_code)
|
82
|
+
|
83
|
+
|
84
|
+
# pylint: disable-next=too-many-return-statements
|
85
|
+
def _try_obtain_telemetry_event() -> EventType | None:
|
86
|
+
"""Try to obtain a telemetry event."""
|
87
|
+
if sys.argv[0].endswith("flower-superlink"):
|
88
|
+
return EventType.RUN_SUPERLINK_LEAVE
|
89
|
+
if sys.argv[0].endswith("flower-supernode"):
|
90
|
+
return EventType.RUN_SUPERNODE_LEAVE
|
91
|
+
if sys.argv[0].endswith("flwr-serverapp"):
|
92
|
+
return EventType.FLWR_SERVERAPP_RUN_LEAVE
|
93
|
+
if sys.argv[0].endswith("flwr-clientapp"):
|
94
|
+
return None # Not yet implemented
|
95
|
+
if sys.argv[0].endswith("flwr-simulation"):
|
96
|
+
return EventType.FLWR_SIMULATION_RUN_LEAVE
|
97
|
+
if sys.argv[0].endswith("flower-simulation"):
|
98
|
+
return EventType.CLI_FLOWER_SIMULATION_LEAVE
|
99
|
+
return None
|
@@ -0,0 +1,90 @@
|
|
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
|
+
"""Exit codes."""
|
16
|
+
|
17
|
+
|
18
|
+
from __future__ import annotations
|
19
|
+
|
20
|
+
|
21
|
+
class ExitCode:
|
22
|
+
"""Exit codes for Flower components."""
|
23
|
+
|
24
|
+
# Success exit codes (0-99)
|
25
|
+
SUCCESS = 0 # Successful exit without any errors or signals
|
26
|
+
GRACEFUL_EXIT_SIGINT = 1 # Graceful exit triggered by SIGINT
|
27
|
+
GRACEFUL_EXIT_SIGQUIT = 2 # Graceful exit triggered by SIGQUIT
|
28
|
+
GRACEFUL_EXIT_SIGTERM = 3 # Graceful exit triggered by SIGTERM
|
29
|
+
|
30
|
+
# SuperLink-specific exit codes (100-199)
|
31
|
+
SUPERLINK_THREAD_CRASH = 100
|
32
|
+
|
33
|
+
# ServerApp-specific exit codes (200-299)
|
34
|
+
|
35
|
+
# SuperNode-specific exit codes (300-399)
|
36
|
+
SUPERNODE_REST_ADDRESS_INVALID = 300
|
37
|
+
SUPERNODE_NODE_AUTH_KEYS_REQUIRED = 301
|
38
|
+
SUPERNODE_NODE_AUTH_KEYS_INVALID = 302
|
39
|
+
|
40
|
+
# ClientApp-specific exit codes (400-499)
|
41
|
+
|
42
|
+
# Common exit codes (500-)
|
43
|
+
COMMON_ADDRESS_INVALID = 500
|
44
|
+
COMMON_MISSING_EXTRA_REST = 501
|
45
|
+
COMMON_TLS_NOT_SUPPORTED = 502
|
46
|
+
|
47
|
+
def __new__(cls) -> ExitCode:
|
48
|
+
"""Prevent instantiation."""
|
49
|
+
raise TypeError(f"{cls.__name__} cannot be instantiated.")
|
50
|
+
|
51
|
+
|
52
|
+
# All short help messages for exit codes
|
53
|
+
EXIT_CODE_HELP = {
|
54
|
+
# Success exit codes (0-99)
|
55
|
+
ExitCode.SUCCESS: "",
|
56
|
+
ExitCode.GRACEFUL_EXIT_SIGINT: "",
|
57
|
+
ExitCode.GRACEFUL_EXIT_SIGQUIT: "",
|
58
|
+
ExitCode.GRACEFUL_EXIT_SIGTERM: "",
|
59
|
+
# SuperLink-specific exit codes (100-199)
|
60
|
+
ExitCode.SUPERLINK_THREAD_CRASH: "An important background thread has crashed.",
|
61
|
+
# ServerApp-specific exit codes (200-299)
|
62
|
+
# SuperNode-specific exit codes (300-399)
|
63
|
+
ExitCode.SUPERNODE_REST_ADDRESS_INVALID: (
|
64
|
+
"When using the REST API, please provide `https://` or "
|
65
|
+
"`http://` before the server address (e.g. `http://127.0.0.1:8080`)"
|
66
|
+
),
|
67
|
+
ExitCode.SUPERNODE_NODE_AUTH_KEYS_REQUIRED: (
|
68
|
+
"Node authentication requires file paths to both "
|
69
|
+
"'--auth-supernode-private-key' and '--auth-supernode-public-key' "
|
70
|
+
"to be provided (providing only one of them is not sufficient)."
|
71
|
+
),
|
72
|
+
ExitCode.SUPERNODE_NODE_AUTH_KEYS_INVALID: (
|
73
|
+
"Node uthentication requires elliptic curve private and public key pair. "
|
74
|
+
"Please ensure that the file path points to a valid private/public key "
|
75
|
+
"file and try again."
|
76
|
+
),
|
77
|
+
# ClientApp-specific exit codes (400-499)
|
78
|
+
# Common exit codes (500-)
|
79
|
+
ExitCode.COMMON_ADDRESS_INVALID: (
|
80
|
+
"Please provide a valid URL, IPv4 or IPv6 address."
|
81
|
+
),
|
82
|
+
ExitCode.COMMON_MISSING_EXTRA_REST: """
|
83
|
+
Extra dependencies required for using the REST-based Fleet API are missing.
|
84
|
+
|
85
|
+
To use the REST API, install `flwr` with the `rest` extra:
|
86
|
+
|
87
|
+
`pip install "flwr[rest]"`.
|
88
|
+
""",
|
89
|
+
ExitCode.COMMON_TLS_NOT_SUPPORTED: "Please use the '--insecure' flag.",
|
90
|
+
}
|
@@ -15,28 +15,38 @@
|
|
15
15
|
"""Common function to register exit handlers for server and client."""
|
16
16
|
|
17
17
|
|
18
|
-
import
|
19
|
-
from signal import SIGINT, SIGTERM, signal
|
18
|
+
from signal import SIGINT, SIGQUIT, SIGTERM, signal
|
20
19
|
from threading import Thread
|
21
20
|
from types import FrameType
|
22
21
|
from typing import Optional
|
23
22
|
|
24
23
|
from grpc import Server
|
25
24
|
|
26
|
-
from flwr.common.telemetry import EventType
|
25
|
+
from flwr.common.telemetry import EventType
|
26
|
+
|
27
|
+
from .exit import ExitCode, flwr_exit
|
28
|
+
|
29
|
+
SIGNAL_TO_EXIT_CODE = {
|
30
|
+
SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
|
31
|
+
SIGQUIT: ExitCode.GRACEFUL_EXIT_SIGQUIT,
|
32
|
+
SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
|
33
|
+
}
|
27
34
|
|
28
35
|
|
29
36
|
def register_exit_handlers(
|
30
37
|
event_type: EventType,
|
38
|
+
exit_message: Optional[str] = None,
|
31
39
|
grpc_servers: Optional[list[Server]] = None,
|
32
40
|
bckg_threads: Optional[list[Thread]] = None,
|
33
41
|
) -> None:
|
34
|
-
"""Register exit handlers for `SIGINT` and `
|
42
|
+
"""Register exit handlers for `SIGINT`, `SIGTERM` and `SIGQUIT` signals.
|
35
43
|
|
36
44
|
Parameters
|
37
45
|
----------
|
38
46
|
event_type : EventType
|
39
47
|
The telemetry event that should be logged before exit.
|
48
|
+
exit_message : Optional[str] (default: None)
|
49
|
+
The message to be logged before exiting.
|
40
50
|
grpc_servers: Optional[List[Server]] (default: None)
|
41
51
|
An otpional list of gRPC servers that need to be gracefully
|
42
52
|
terminated before exiting.
|
@@ -46,6 +56,7 @@ def register_exit_handlers(
|
|
46
56
|
"""
|
47
57
|
default_handlers = {
|
48
58
|
SIGINT: None,
|
59
|
+
SIGQUIT: None,
|
49
60
|
SIGTERM: None,
|
50
61
|
}
|
51
62
|
|
@@ -61,8 +72,6 @@ def register_exit_handlers(
|
|
61
72
|
# Reset to default handler
|
62
73
|
signal(signalnum, default_handlers[signalnum])
|
63
74
|
|
64
|
-
event_res = event(event_type=event_type)
|
65
|
-
|
66
75
|
if grpc_servers is not None:
|
67
76
|
for grpc_server in grpc_servers:
|
68
77
|
grpc_server.stop(grace=1)
|
@@ -71,16 +80,21 @@ def register_exit_handlers(
|
|
71
80
|
for bckg_thread in bckg_threads:
|
72
81
|
bckg_thread.join()
|
73
82
|
|
74
|
-
# Ensure event has happend
|
75
|
-
event_res.result()
|
76
|
-
|
77
83
|
# Setup things for graceful exit
|
78
|
-
|
84
|
+
flwr_exit(
|
85
|
+
code=SIGNAL_TO_EXIT_CODE[signalnum],
|
86
|
+
message=exit_message,
|
87
|
+
event_type=event_type,
|
88
|
+
)
|
79
89
|
|
80
90
|
default_handlers[SIGINT] = signal( # type: ignore
|
81
91
|
SIGINT,
|
82
92
|
graceful_exit_handler, # type: ignore
|
83
93
|
)
|
94
|
+
default_handlers[SIGQUIT] = signal( # type: ignore
|
95
|
+
SIGQUIT,
|
96
|
+
graceful_exit_handler, # type: ignore
|
97
|
+
)
|
84
98
|
default_handlers[SIGTERM] = signal( # type: ignore
|
85
99
|
SIGTERM,
|
86
100
|
graceful_exit_handler, # type: ignore
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# NO CHECKED-IN PROTOBUF GENCODE
|
4
|
+
# source: flwr/proto/serverappio.proto
|
5
|
+
# Protobuf Python Version: 5.29.0
|
6
|
+
"""Generated protocol buffer code."""
|
7
|
+
from google.protobuf import descriptor as _descriptor
|
8
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
9
|
+
from google.protobuf import runtime_version as _runtime_version
|
10
|
+
from google.protobuf import symbol_database as _symbol_database
|
11
|
+
from google.protobuf.internal import builder as _builder
|
12
|
+
_runtime_version.ValidateProtobufRuntimeVersion(
|
13
|
+
_runtime_version.Domain.PUBLIC,
|
14
|
+
5,
|
15
|
+
29,
|
16
|
+
0,
|
17
|
+
'',
|
18
|
+
'flwr/proto/serverappio.proto'
|
19
|
+
)
|
20
|
+
# @@protoc_insertion_point(imports)
|
21
|
+
|
22
|
+
_sym_db = _symbol_database.Default()
|
23
|
+
|
24
|
+
|
25
|
+
from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
|
26
|
+
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
27
|
+
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
28
|
+
from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
|
29
|
+
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
30
|
+
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
31
|
+
|
32
|
+
|
33
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"P\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"V\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x04\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"T\n\x16PushInsMessagesRequest\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\".\n\x17PushInsMessagesResponse\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\"=\n\x16PullResMessagesRequest\x12\x13\n\x0bmessage_ids\x18\x01 \x03(\t\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\"E\n\x17PullResMessagesResponse\x12*\n\rmessages_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.Message\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xd5\x08\n\x0bServerAppIo\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12Y\n\x0cPushMessages\x12\".flwr.proto.PushInsMessagesRequest\x1a#.flwr.proto.PushInsMessagesResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\x00\x12Y\n\x0cPullMessages\x12\".flwr.proto.PullResMessagesRequest\x1a#.flwr.proto.PullResMessagesResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x62\x06proto3')
|
34
|
+
|
35
|
+
_globals = globals()
|
36
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
37
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.serverappio_pb2', _globals)
|
38
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
39
|
+
DESCRIPTOR._loaded_options = None
|
40
|
+
_globals['_GETNODESREQUEST']._serialized_start=182
|
41
|
+
_globals['_GETNODESREQUEST']._serialized_end=215
|
42
|
+
_globals['_GETNODESRESPONSE']._serialized_start=217
|
43
|
+
_globals['_GETNODESRESPONSE']._serialized_end=268
|
44
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_start=270
|
45
|
+
_globals['_PUSHTASKINSREQUEST']._serialized_end=350
|
46
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_start=352
|
47
|
+
_globals['_PUSHTASKINSRESPONSE']._serialized_end=391
|
48
|
+
_globals['_PULLTASKRESREQUEST']._serialized_start=393
|
49
|
+
_globals['_PULLTASKRESREQUEST']._serialized_end=479
|
50
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_start=481
|
51
|
+
_globals['_PULLTASKRESRESPONSE']._serialized_end=546
|
52
|
+
_globals['_PUSHINSMESSAGESREQUEST']._serialized_start=548
|
53
|
+
_globals['_PUSHINSMESSAGESREQUEST']._serialized_end=632
|
54
|
+
_globals['_PUSHINSMESSAGESRESPONSE']._serialized_start=634
|
55
|
+
_globals['_PUSHINSMESSAGESRESPONSE']._serialized_end=680
|
56
|
+
_globals['_PULLRESMESSAGESREQUEST']._serialized_start=682
|
57
|
+
_globals['_PULLRESMESSAGESREQUEST']._serialized_end=743
|
58
|
+
_globals['_PULLRESMESSAGESRESPONSE']._serialized_start=745
|
59
|
+
_globals['_PULLRESMESSAGESRESPONSE']._serialized_end=814
|
60
|
+
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=816
|
61
|
+
_globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=844
|
62
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=846
|
63
|
+
_globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=973
|
64
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=975
|
65
|
+
_globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=1058
|
66
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=1060
|
67
|
+
_globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=1090
|
68
|
+
_globals['_SERVERAPPIO']._serialized_start=1093
|
69
|
+
_globals['_SERVERAPPIO']._serialized_end=2202
|
70
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -101,6 +101,62 @@ class PullTaskResResponse(google.protobuf.message.Message):
|
|
101
101
|
def ClearField(self, field_name: typing_extensions.Literal["task_res_list",b"task_res_list"]) -> None: ...
|
102
102
|
global___PullTaskResResponse = PullTaskResResponse
|
103
103
|
|
104
|
+
class PushInsMessagesRequest(google.protobuf.message.Message):
|
105
|
+
"""PushMessages messages"""
|
106
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
107
|
+
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
108
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
109
|
+
@property
|
110
|
+
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
111
|
+
run_id: builtins.int
|
112
|
+
def __init__(self,
|
113
|
+
*,
|
114
|
+
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
115
|
+
run_id: builtins.int = ...,
|
116
|
+
) -> None: ...
|
117
|
+
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","run_id",b"run_id"]) -> None: ...
|
118
|
+
global___PushInsMessagesRequest = PushInsMessagesRequest
|
119
|
+
|
120
|
+
class PushInsMessagesResponse(google.protobuf.message.Message):
|
121
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
122
|
+
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
123
|
+
@property
|
124
|
+
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
125
|
+
def __init__(self,
|
126
|
+
*,
|
127
|
+
message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
128
|
+
) -> None: ...
|
129
|
+
def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids"]) -> None: ...
|
130
|
+
global___PushInsMessagesResponse = PushInsMessagesResponse
|
131
|
+
|
132
|
+
class PullResMessagesRequest(google.protobuf.message.Message):
|
133
|
+
"""PullMessages messages"""
|
134
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
135
|
+
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
136
|
+
RUN_ID_FIELD_NUMBER: builtins.int
|
137
|
+
@property
|
138
|
+
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
139
|
+
run_id: builtins.int
|
140
|
+
def __init__(self,
|
141
|
+
*,
|
142
|
+
message_ids: typing.Optional[typing.Iterable[typing.Text]] = ...,
|
143
|
+
run_id: builtins.int = ...,
|
144
|
+
) -> None: ...
|
145
|
+
def ClearField(self, field_name: typing_extensions.Literal["message_ids",b"message_ids","run_id",b"run_id"]) -> None: ...
|
146
|
+
global___PullResMessagesRequest = PullResMessagesRequest
|
147
|
+
|
148
|
+
class PullResMessagesResponse(google.protobuf.message.Message):
|
149
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
150
|
+
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
151
|
+
@property
|
152
|
+
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
153
|
+
def __init__(self,
|
154
|
+
*,
|
155
|
+
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
156
|
+
) -> None: ...
|
157
|
+
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list"]) -> None: ...
|
158
|
+
global___PullResMessagesResponse = PullResMessagesResponse
|
159
|
+
|
104
160
|
class PullServerAppInputsRequest(google.protobuf.message.Message):
|
105
161
|
"""PullServerAppInputs messages"""
|
106
162
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|