flwr 1.17.0__py3-none-any.whl → 1.19.0__py3-none-any.whl
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/__init__.py +1 -1
- flwr/app/__init__.py +15 -0
- flwr/app/error.py +68 -0
- flwr/app/metadata.py +223 -0
- flwr/cli/__init__.py +1 -1
- flwr/cli/app.py +21 -2
- flwr/cli/build.py +83 -58
- flwr/cli/cli_user_auth_interceptor.py +1 -1
- flwr/cli/config_utils.py +53 -17
- flwr/cli/example.py +1 -1
- flwr/cli/install.py +1 -1
- flwr/cli/log.py +4 -4
- flwr/cli/login/__init__.py +1 -1
- flwr/cli/login/login.py +15 -8
- flwr/cli/ls.py +16 -37
- flwr/cli/new/__init__.py +1 -1
- flwr/cli/new/new.py +4 -4
- flwr/cli/new/templates/__init__.py +1 -1
- flwr/cli/new/templates/app/__init__.py +1 -1
- flwr/cli/new/templates/app/code/__init__.py +1 -1
- flwr/cli/new/templates/app/code/client.baseline.py.tpl +1 -1
- flwr/cli/new/templates/app/code/flwr_tune/__init__.py +1 -1
- flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +4 -4
- flwr/cli/new/templates/app/code/model.baseline.py.tpl +1 -1
- flwr/cli/new/templates/app/code/server.baseline.py.tpl +2 -3
- flwr/cli/new/templates/app/code/task.sklearn.py.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +14 -17
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +4 -4
- flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
- flwr/cli/run/__init__.py +1 -1
- flwr/cli/run/run.py +11 -19
- flwr/cli/stop.py +3 -3
- flwr/cli/utils.py +42 -17
- flwr/client/__init__.py +3 -3
- flwr/client/client.py +1 -1
- flwr/client/client_app.py +140 -138
- flwr/client/clientapp/__init__.py +1 -8
- flwr/client/clientapp/utils.py +1 -1
- flwr/client/dpfedavg_numpy_client.py +1 -1
- flwr/client/grpc_adapter_client/__init__.py +1 -1
- flwr/client/grpc_adapter_client/connection.py +5 -5
- flwr/client/grpc_rere_client/__init__.py +1 -1
- flwr/client/grpc_rere_client/client_interceptor.py +1 -1
- flwr/client/grpc_rere_client/connection.py +131 -61
- flwr/client/grpc_rere_client/grpc_adapter.py +35 -7
- flwr/client/message_handler/__init__.py +1 -1
- flwr/client/message_handler/message_handler.py +2 -2
- flwr/client/mod/__init__.py +1 -1
- flwr/client/mod/centraldp_mods.py +1 -1
- flwr/client/mod/comms_mods.py +39 -20
- flwr/client/mod/localdp_mod.py +6 -6
- flwr/client/mod/secure_aggregation/__init__.py +1 -1
- flwr/client/mod/secure_aggregation/secagg_mod.py +1 -1
- flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
- flwr/client/mod/utils.py +1 -1
- flwr/client/numpy_client.py +1 -1
- flwr/client/rest_client/__init__.py +1 -1
- flwr/client/rest_client/connection.py +174 -68
- flwr/client/run_info_store.py +1 -1
- flwr/client/typing.py +1 -1
- flwr/clientapp/__init__.py +15 -0
- flwr/common/__init__.py +3 -3
- flwr/common/address.py +1 -1
- flwr/common/args.py +1 -1
- flwr/common/auth_plugin/__init__.py +3 -1
- flwr/common/auth_plugin/auth_plugin.py +30 -4
- flwr/common/config.py +1 -1
- flwr/common/constant.py +37 -8
- flwr/common/context.py +1 -1
- flwr/common/date.py +1 -1
- flwr/common/differential_privacy.py +1 -1
- flwr/common/differential_privacy_constants.py +1 -1
- flwr/common/dp.py +1 -1
- flwr/common/event_log_plugin/event_log_plugin.py +3 -3
- flwr/common/exit/exit.py +6 -6
- flwr/common/exit_handlers.py +31 -1
- flwr/common/grpc.py +1 -1
- flwr/common/heartbeat.py +165 -0
- flwr/common/inflatable.py +290 -0
- flwr/common/inflatable_grpc_utils.py +99 -0
- flwr/common/inflatable_rest_utils.py +99 -0
- flwr/common/inflatable_utils.py +341 -0
- flwr/common/logger.py +1 -1
- flwr/common/message.py +137 -252
- flwr/common/object_ref.py +1 -1
- flwr/common/parameter.py +1 -1
- flwr/common/pyproject.py +1 -1
- flwr/common/record/__init__.py +3 -2
- flwr/common/record/array.py +323 -0
- flwr/common/record/arrayrecord.py +121 -243
- flwr/common/record/configrecord.py +71 -16
- flwr/common/record/conversion_utils.py +2 -2
- flwr/common/record/metricrecord.py +71 -20
- flwr/common/record/recorddict.py +207 -90
- flwr/common/record/typeddict.py +1 -1
- flwr/common/recorddict_compat.py +2 -2
- flwr/common/retry_invoker.py +15 -11
- flwr/common/secure_aggregation/__init__.py +1 -1
- flwr/common/secure_aggregation/crypto/__init__.py +1 -1
- flwr/common/secure_aggregation/crypto/shamir.py +52 -30
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -1
- flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
- flwr/common/secure_aggregation/quantization.py +1 -1
- flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
- flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
- flwr/common/serde.py +60 -184
- flwr/common/serde_utils.py +175 -0
- flwr/common/telemetry.py +2 -2
- flwr/common/typing.py +6 -4
- flwr/common/version.py +1 -1
- flwr/compat/__init__.py +15 -0
- flwr/compat/client/__init__.py +15 -0
- flwr/{client → compat/client}/app.py +71 -211
- flwr/{client → compat/client}/grpc_client/__init__.py +1 -1
- flwr/{client → compat/client}/grpc_client/connection.py +13 -13
- flwr/compat/common/__init__.py +15 -0
- flwr/compat/server/__init__.py +15 -0
- flwr/compat/server/app.py +174 -0
- flwr/compat/simulation/__init__.py +15 -0
- flwr/proto/__init__.py +1 -1
- flwr/proto/fleet_pb2.py +32 -27
- flwr/proto/fleet_pb2.pyi +49 -35
- flwr/proto/fleet_pb2_grpc.py +117 -13
- flwr/proto/fleet_pb2_grpc.pyi +47 -6
- flwr/proto/heartbeat_pb2.py +33 -0
- flwr/proto/heartbeat_pb2.pyi +66 -0
- flwr/proto/heartbeat_pb2_grpc.py +4 -0
- flwr/proto/heartbeat_pb2_grpc.pyi +4 -0
- flwr/proto/message_pb2.py +28 -11
- flwr/proto/message_pb2.pyi +125 -0
- flwr/proto/recorddict_pb2.py +16 -28
- flwr/proto/recorddict_pb2.pyi +46 -64
- flwr/proto/run_pb2.py +24 -32
- flwr/proto/run_pb2.pyi +4 -52
- flwr/proto/serverappio_pb2.py +32 -23
- flwr/proto/serverappio_pb2.pyi +45 -3
- flwr/proto/serverappio_pb2_grpc.py +138 -34
- flwr/proto/serverappio_pb2_grpc.pyi +54 -13
- flwr/proto/simulationio_pb2.py +12 -11
- flwr/proto/simulationio_pb2_grpc.py +35 -0
- flwr/proto/simulationio_pb2_grpc.pyi +14 -0
- flwr/server/__init__.py +2 -2
- flwr/server/app.py +69 -187
- flwr/server/client_manager.py +1 -1
- flwr/server/client_proxy.py +1 -1
- flwr/server/compat/__init__.py +1 -1
- flwr/server/compat/app.py +1 -1
- flwr/server/compat/app_utils.py +51 -29
- flwr/server/compat/legacy_context.py +1 -1
- flwr/server/criterion.py +1 -1
- flwr/server/fleet_event_log_interceptor.py +2 -2
- flwr/server/grid/grid.py +3 -3
- flwr/server/grid/grpc_grid.py +104 -34
- flwr/server/grid/inmemory_grid.py +5 -4
- flwr/server/history.py +1 -1
- flwr/server/run_serverapp.py +1 -1
- flwr/server/server.py +1 -1
- flwr/server/server_app.py +65 -58
- flwr/server/server_config.py +1 -1
- flwr/server/serverapp/__init__.py +1 -1
- flwr/server/serverapp/app.py +19 -1
- flwr/server/serverapp_components.py +1 -1
- flwr/server/strategy/__init__.py +1 -1
- flwr/server/strategy/aggregate.py +1 -1
- flwr/server/strategy/bulyan.py +2 -2
- flwr/server/strategy/dp_adaptive_clipping.py +17 -17
- flwr/server/strategy/dp_fixed_clipping.py +17 -17
- flwr/server/strategy/dpfedavg_adaptive.py +1 -1
- flwr/server/strategy/dpfedavg_fixed.py +1 -1
- flwr/server/strategy/fault_tolerant_fedavg.py +1 -1
- flwr/server/strategy/fedadagrad.py +1 -1
- flwr/server/strategy/fedadam.py +1 -1
- flwr/server/strategy/fedavg.py +1 -1
- flwr/server/strategy/fedavg_android.py +1 -1
- flwr/server/strategy/fedavgm.py +1 -1
- flwr/server/strategy/fedmedian.py +1 -1
- flwr/server/strategy/fedopt.py +1 -1
- flwr/server/strategy/fedprox.py +1 -1
- flwr/server/strategy/fedtrimmedavg.py +1 -1
- flwr/server/strategy/fedxgb_bagging.py +1 -1
- flwr/server/strategy/fedxgb_cyclic.py +1 -1
- flwr/server/strategy/fedxgb_nn_avg.py +3 -2
- flwr/server/strategy/fedyogi.py +1 -1
- flwr/server/strategy/krum.py +1 -1
- flwr/server/strategy/qfedavg.py +1 -1
- flwr/server/strategy/strategy.py +1 -1
- flwr/server/superlink/__init__.py +1 -1
- flwr/server/superlink/ffs/__init__.py +3 -1
- flwr/server/superlink/ffs/disk_ffs.py +1 -1
- flwr/server/superlink/ffs/ffs.py +1 -1
- flwr/server/superlink/ffs/ffs_factory.py +1 -1
- flwr/server/superlink/fleet/__init__.py +1 -1
- flwr/server/superlink/fleet/grpc_adapter/__init__.py +1 -1
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +14 -4
- flwr/server/superlink/fleet/grpc_bidi/__init__.py +1 -1
- flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
- flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
- flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
- flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +13 -13
- flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +102 -8
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -1
- flwr/server/superlink/fleet/message_handler/__init__.py +1 -1
- flwr/server/superlink/fleet/message_handler/message_handler.py +136 -19
- flwr/server/superlink/fleet/rest_rere/__init__.py +1 -1
- flwr/server/superlink/fleet/rest_rere/rest_api.py +73 -12
- flwr/server/superlink/fleet/vce/__init__.py +1 -1
- flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
- flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
- flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
- flwr/server/superlink/fleet/vce/vce_api.py +7 -4
- flwr/server/superlink/linkstate/__init__.py +1 -1
- flwr/server/superlink/linkstate/in_memory_linkstate.py +139 -44
- flwr/server/superlink/linkstate/linkstate.py +54 -21
- flwr/server/superlink/linkstate/linkstate_factory.py +1 -1
- flwr/server/superlink/linkstate/sqlite_linkstate.py +150 -56
- flwr/server/superlink/linkstate/utils.py +34 -30
- flwr/server/superlink/serverappio/serverappio_grpc.py +3 -0
- flwr/server/superlink/serverappio/serverappio_servicer.py +211 -57
- flwr/server/superlink/simulation/__init__.py +1 -1
- flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
- flwr/server/superlink/simulation/simulationio_servicer.py +26 -2
- flwr/server/superlink/utils.py +45 -3
- flwr/server/typing.py +1 -1
- flwr/server/utils/__init__.py +1 -1
- flwr/server/utils/tensorboard.py +1 -1
- flwr/server/utils/validator.py +3 -3
- flwr/server/workflow/__init__.py +1 -1
- flwr/server/workflow/constant.py +1 -1
- flwr/server/workflow/default_workflows.py +1 -1
- flwr/server/workflow/secure_aggregation/__init__.py +1 -1
- flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -1
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -1
- flwr/serverapp/__init__.py +15 -0
- flwr/simulation/__init__.py +1 -1
- flwr/simulation/app.py +18 -1
- flwr/simulation/legacy_app.py +1 -1
- flwr/simulation/ray_transport/__init__.py +1 -1
- flwr/simulation/ray_transport/ray_actor.py +1 -1
- flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
- flwr/simulation/ray_transport/utils.py +1 -1
- flwr/simulation/run_simulation.py +2 -2
- flwr/simulation/simulationio_connection.py +1 -1
- flwr/supercore/__init__.py +15 -0
- flwr/supercore/object_store/__init__.py +24 -0
- flwr/supercore/object_store/in_memory_object_store.py +229 -0
- flwr/supercore/object_store/object_store.py +192 -0
- flwr/supercore/object_store/object_store_factory.py +44 -0
- flwr/superexec/__init__.py +1 -1
- flwr/superexec/app.py +1 -1
- flwr/superexec/deployment.py +7 -3
- flwr/superexec/exec_event_log_interceptor.py +4 -4
- flwr/superexec/exec_grpc.py +8 -4
- flwr/superexec/exec_servicer.py +126 -24
- flwr/superexec/exec_user_auth_interceptor.py +38 -9
- flwr/superexec/executor.py +5 -1
- flwr/superexec/simulation.py +8 -2
- flwr/superlink/__init__.py +15 -0
- flwr/{client/supernode → supernode}/__init__.py +1 -8
- flwr/{client/nodestate/nodestate.py → supernode/cli/__init__.py} +8 -15
- flwr/{client/supernode/app.py → supernode/cli/flower_supernode.py} +4 -13
- flwr/supernode/cli/flwr_clientapp.py +81 -0
- flwr/{client → supernode}/nodestate/__init__.py +1 -1
- flwr/supernode/nodestate/in_memory_nodestate.py +190 -0
- flwr/supernode/nodestate/nodestate.py +212 -0
- flwr/{client → supernode}/nodestate/nodestate_factory.py +1 -1
- flwr/supernode/runtime/__init__.py +15 -0
- flwr/{client/clientapp/app.py → supernode/runtime/run_clientapp.py} +26 -57
- flwr/supernode/servicer/__init__.py +15 -0
- flwr/supernode/servicer/clientappio/__init__.py +24 -0
- flwr/{client/clientapp → supernode/servicer/clientappio}/clientappio_servicer.py +1 -1
- flwr/supernode/start_client_internal.py +491 -0
- {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/METADATA +6 -5
- flwr-1.19.0.dist-info/RECORD +365 -0
- {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/WHEEL +1 -1
- {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/entry_points.txt +2 -2
- flwr/client/heartbeat.py +0 -74
- flwr/client/nodestate/in_memory_nodestate.py +0 -38
- flwr-1.17.0.dist-info/LICENSE +0 -202
- flwr-1.17.0.dist-info/RECORD +0 -333
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright
|
|
1
|
+
# Copyright 2025 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.
|
|
@@ -104,18 +104,18 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
|
|
|
104
104
|
|
|
105
105
|
Examples
|
|
106
106
|
--------
|
|
107
|
-
Establishing a
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
107
|
+
Establishing a TLS-enabled connection to the server::
|
|
108
|
+
|
|
109
|
+
from pathlib import Path
|
|
110
|
+
with grpc_connection(
|
|
111
|
+
server_address,
|
|
112
|
+
max_message_length=max_message_length,
|
|
113
|
+
root_certificates=Path("/crts/root.pem").read_bytes(),
|
|
114
|
+
) as conn:
|
|
115
|
+
receive, send = conn
|
|
116
|
+
server_message = receive()
|
|
117
|
+
# do something here
|
|
118
|
+
send(client_message)
|
|
119
119
|
"""
|
|
120
120
|
if isinstance(root_certificates, str):
|
|
121
121
|
root_certificates = Path(root_certificates).read_bytes()
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
"""Legacy components previously located in ``flwr.common``."""
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
"""Legacy components previously located in ``flwr.server``."""
|
|
@@ -0,0 +1,174 @@
|
|
|
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 server app."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import sys
|
|
19
|
+
from logging import INFO
|
|
20
|
+
from typing import Optional
|
|
21
|
+
|
|
22
|
+
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
|
|
23
|
+
from flwr.common.address import parse_address
|
|
24
|
+
from flwr.common.constant import FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS
|
|
25
|
+
from flwr.common.exit_handlers import register_exit_handlers
|
|
26
|
+
from flwr.common.logger import log, warn_deprecated_feature
|
|
27
|
+
from flwr.server.client_manager import ClientManager
|
|
28
|
+
from flwr.server.history import History
|
|
29
|
+
from flwr.server.server import Server, init_defaults, run_fl
|
|
30
|
+
from flwr.server.server_config import ServerConfig
|
|
31
|
+
from flwr.server.strategy import Strategy
|
|
32
|
+
from flwr.server.superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def start_server( # pylint: disable=too-many-arguments,too-many-locals
|
|
36
|
+
*,
|
|
37
|
+
server_address: str = FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
|
|
38
|
+
server: Optional[Server] = None,
|
|
39
|
+
config: Optional[ServerConfig] = None,
|
|
40
|
+
strategy: Optional[Strategy] = None,
|
|
41
|
+
client_manager: Optional[ClientManager] = None,
|
|
42
|
+
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
43
|
+
certificates: Optional[tuple[bytes, bytes, bytes]] = None,
|
|
44
|
+
) -> History:
|
|
45
|
+
"""Start a Flower server using the gRPC transport layer.
|
|
46
|
+
|
|
47
|
+
Warning
|
|
48
|
+
-------
|
|
49
|
+
This function is deprecated since 1.13.0. Use the :code:`flower-superlink` command
|
|
50
|
+
instead to start a SuperLink.
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
server_address : Optional[str]
|
|
55
|
+
The IPv4 or IPv6 address of the server. Defaults to `"[::]:8080"`.
|
|
56
|
+
server : Optional[flwr.server.Server] (default: None)
|
|
57
|
+
A server implementation, either `flwr.server.Server` or a subclass
|
|
58
|
+
thereof. If no instance is provided, then `start_server` will create
|
|
59
|
+
one.
|
|
60
|
+
config : Optional[ServerConfig] (default: None)
|
|
61
|
+
Currently supported values are `num_rounds` (int, default: 1) and
|
|
62
|
+
`round_timeout` in seconds (float, default: None).
|
|
63
|
+
strategy : Optional[flwr.server.Strategy] (default: None).
|
|
64
|
+
An implementation of the abstract base class
|
|
65
|
+
`flwr.server.strategy.Strategy`. If no strategy is provided, then
|
|
66
|
+
`start_server` will use `flwr.server.strategy.FedAvg`.
|
|
67
|
+
client_manager : Optional[flwr.server.ClientManager] (default: None)
|
|
68
|
+
An implementation of the abstract base class
|
|
69
|
+
`flwr.server.ClientManager`. If no implementation is provided, then
|
|
70
|
+
`start_server` will use
|
|
71
|
+
`flwr.server.client_manager.SimpleClientManager`.
|
|
72
|
+
grpc_max_message_length : int (default: 536_870_912, this equals 512MB)
|
|
73
|
+
The maximum length of gRPC messages that can be exchanged with the
|
|
74
|
+
Flower clients. The default should be sufficient for most models.
|
|
75
|
+
Users who train very large models might need to increase this
|
|
76
|
+
value. Note that the Flower clients need to be started with the
|
|
77
|
+
same value (see `flwr.client.start_client`), otherwise clients will
|
|
78
|
+
not know about the increased limit and block larger messages.
|
|
79
|
+
certificates : Tuple[bytes, bytes, bytes] (default: None)
|
|
80
|
+
Tuple containing root certificate, server certificate, and private key
|
|
81
|
+
to start a secure SSL-enabled server. The tuple is expected to have
|
|
82
|
+
three bytes elements in the following order:
|
|
83
|
+
|
|
84
|
+
* CA certificate.
|
|
85
|
+
* server certificate.
|
|
86
|
+
* server private key.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
hist : flwr.server.history.History
|
|
91
|
+
Object containing training and evaluation metrics.
|
|
92
|
+
|
|
93
|
+
Examples
|
|
94
|
+
--------
|
|
95
|
+
Starting an insecure server::
|
|
96
|
+
|
|
97
|
+
start_server()
|
|
98
|
+
|
|
99
|
+
Starting a TLS-enabled server::
|
|
100
|
+
|
|
101
|
+
start_server(
|
|
102
|
+
certificates=(
|
|
103
|
+
Path("/crts/root.pem").read_bytes(),
|
|
104
|
+
Path("/crts/localhost.crt").read_bytes(),
|
|
105
|
+
Path("/crts/localhost.key").read_bytes()
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
"""
|
|
109
|
+
msg = (
|
|
110
|
+
"flwr.server.start_server() is deprecated."
|
|
111
|
+
"\n\tInstead, use the `flower-superlink` CLI command to start a SuperLink "
|
|
112
|
+
"as shown below:"
|
|
113
|
+
"\n\n\t\t$ flower-superlink --insecure"
|
|
114
|
+
"\n\n\tTo view usage and all available options, run:"
|
|
115
|
+
"\n\n\t\t$ flower-superlink --help"
|
|
116
|
+
"\n\n\tUsing `start_server()` is deprecated."
|
|
117
|
+
)
|
|
118
|
+
warn_deprecated_feature(name=msg)
|
|
119
|
+
|
|
120
|
+
event(EventType.START_SERVER_ENTER)
|
|
121
|
+
|
|
122
|
+
# Parse IP address
|
|
123
|
+
parsed_address = parse_address(server_address)
|
|
124
|
+
if not parsed_address:
|
|
125
|
+
sys.exit(f"Server IP address ({server_address}) cannot be parsed.")
|
|
126
|
+
host, port, is_v6 = parsed_address
|
|
127
|
+
address = f"[{host}]:{port}" if is_v6 else f"{host}:{port}"
|
|
128
|
+
|
|
129
|
+
# Initialize server and server config
|
|
130
|
+
initialized_server, initialized_config = init_defaults(
|
|
131
|
+
server=server,
|
|
132
|
+
config=config,
|
|
133
|
+
strategy=strategy,
|
|
134
|
+
client_manager=client_manager,
|
|
135
|
+
)
|
|
136
|
+
log(
|
|
137
|
+
INFO,
|
|
138
|
+
"Starting Flower server, config: %s",
|
|
139
|
+
initialized_config,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Start gRPC server
|
|
143
|
+
grpc_server = start_grpc_server(
|
|
144
|
+
client_manager=initialized_server.client_manager(),
|
|
145
|
+
server_address=address,
|
|
146
|
+
max_message_length=grpc_max_message_length,
|
|
147
|
+
certificates=certificates,
|
|
148
|
+
)
|
|
149
|
+
log(
|
|
150
|
+
INFO,
|
|
151
|
+
"Flower ECE: gRPC server running (%s rounds), SSL is %s",
|
|
152
|
+
initialized_config.num_rounds,
|
|
153
|
+
"enabled" if certificates is not None else "disabled",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Graceful shutdown
|
|
157
|
+
register_exit_handlers(
|
|
158
|
+
event_type=EventType.START_SERVER_LEAVE,
|
|
159
|
+
exit_message="Flower server terminated gracefully.",
|
|
160
|
+
grpc_servers=[grpc_server],
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Start training
|
|
164
|
+
hist = run_fl(
|
|
165
|
+
server=initialized_server,
|
|
166
|
+
config=initialized_config,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Stop the gRPC server
|
|
170
|
+
grpc_server.stop(grace=1)
|
|
171
|
+
|
|
172
|
+
event(EventType.START_SERVER_LEAVE)
|
|
173
|
+
|
|
174
|
+
return hist
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
"""Legacy components previously located in ``flwr.simulation``."""
|
flwr/proto/__init__.py
CHANGED
flwr/proto/fleet_pb2.py
CHANGED
|
@@ -12,45 +12,50 @@ from google.protobuf.internal import builder as _builder
|
|
|
12
12
|
_sym_db = _symbol_database.Default()
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
|
|
15
16
|
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
|
16
17
|
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
|
17
18
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
|
18
19
|
from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"
|
|
22
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x18\x66lwr/proto/message.proto\"/\n\x11\x43reateNodeRequest\x12\x1a\n\x12heartbeat_interval\x18\x01 \x01(\x01\"4\n\x12\x43reateNodeResponse\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"3\n\x11\x44\x65leteNodeRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x14\n\x12\x44\x65leteNodeResponse\"J\n\x13PullMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x13\n\x0bmessage_ids\x18\x02 \x03(\t\"\x87\x02\n\x14PullMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12L\n\x0fobjects_to_pull\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PullMessagesResponse.ObjectsToPullEntry\x1aK\n\x12ObjectsToPullEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x97\x01\n\x13PushMessagesRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12*\n\rmessages_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.Message\x12\x34\n\x14message_object_trees\x18\x03 \x03(\x0b\x32\x16.flwr.proto.ObjectTree\"\xcb\x02\n\x14PushMessagesResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12>\n\x07results\x18\x02 \x03(\x0b\x32-.flwr.proto.PushMessagesResponse.ResultsEntry\x12L\n\x0fobjects_to_push\x18\x03 \x03(\x0b\x32\x33.flwr.proto.PushMessagesResponse.ObjectsToPushEntry\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\x1aK\n\x12ObjectsToPushEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12$\n\x05value\x18\x02 \x01(\x0b\x32\x15.flwr.proto.ObjectIDs:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xca\x06\n\x05\x46leet\x12M\n\nCreateNode\x12\x1d.flwr.proto.CreateNodeRequest\x1a\x1e.flwr.proto.CreateNodeResponse\"\x00\x12M\n\nDeleteNode\x12\x1d.flwr.proto.DeleteNodeRequest\x1a\x1e.flwr.proto.DeleteNodeResponse\"\x00\x12\x62\n\x11SendNodeHeartbeat\x12$.flwr.proto.SendNodeHeartbeatRequest\x1a%.flwr.proto.SendNodeHeartbeatResponse\"\x00\x12S\n\x0cPullMessages\x12\x1f.flwr.proto.PullMessagesRequest\x1a .flwr.proto.PullMessagesResponse\"\x00\x12S\n\x0cPushMessages\x12\x1f.flwr.proto.PushMessagesRequest\x1a .flwr.proto.PushMessagesResponse\"\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\x12M\n\nPushObject\x12\x1d.flwr.proto.PushObjectRequest\x1a\x1e.flwr.proto.PushObjectResponse\"\x00\x12M\n\nPullObject\x12\x1d.flwr.proto.PullObjectRequest\x1a\x1e.flwr.proto.PullObjectResponse\"\x00\x12q\n\x16\x43onfirmMessageReceived\x12).flwr.proto.ConfirmMessageReceivedRequest\x1a*.flwr.proto.ConfirmMessageReceivedResponse\"\x00\x62\x06proto3')
|
|
22
23
|
|
|
23
24
|
_globals = globals()
|
|
24
25
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
25
26
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
|
|
26
27
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
27
28
|
DESCRIPTOR._options = None
|
|
29
|
+
_globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._options = None
|
|
30
|
+
_globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_options = b'8\001'
|
|
28
31
|
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
|
|
29
32
|
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
|
|
30
|
-
_globals['
|
|
31
|
-
_globals['
|
|
32
|
-
_globals['
|
|
33
|
-
_globals['
|
|
34
|
-
_globals['
|
|
35
|
-
_globals['
|
|
36
|
-
_globals['
|
|
37
|
-
_globals['
|
|
38
|
-
_globals['
|
|
39
|
-
_globals['
|
|
40
|
-
_globals['
|
|
41
|
-
_globals['
|
|
42
|
-
_globals['
|
|
43
|
-
_globals['
|
|
44
|
-
_globals['
|
|
45
|
-
_globals['
|
|
46
|
-
_globals['_PUSHMESSAGESREQUEST']._serialized_start=
|
|
47
|
-
_globals['_PUSHMESSAGESREQUEST']._serialized_end=
|
|
48
|
-
_globals['_PUSHMESSAGESRESPONSE']._serialized_start=
|
|
49
|
-
_globals['_PUSHMESSAGESRESPONSE']._serialized_end=
|
|
50
|
-
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=
|
|
51
|
-
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=
|
|
52
|
-
_globals['
|
|
53
|
-
_globals['
|
|
54
|
-
_globals['
|
|
55
|
-
_globals['
|
|
33
|
+
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._options = None
|
|
34
|
+
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_options = b'8\001'
|
|
35
|
+
_globals['_CREATENODEREQUEST']._serialized_start=159
|
|
36
|
+
_globals['_CREATENODEREQUEST']._serialized_end=206
|
|
37
|
+
_globals['_CREATENODERESPONSE']._serialized_start=208
|
|
38
|
+
_globals['_CREATENODERESPONSE']._serialized_end=260
|
|
39
|
+
_globals['_DELETENODEREQUEST']._serialized_start=262
|
|
40
|
+
_globals['_DELETENODEREQUEST']._serialized_end=313
|
|
41
|
+
_globals['_DELETENODERESPONSE']._serialized_start=315
|
|
42
|
+
_globals['_DELETENODERESPONSE']._serialized_end=335
|
|
43
|
+
_globals['_PULLMESSAGESREQUEST']._serialized_start=337
|
|
44
|
+
_globals['_PULLMESSAGESREQUEST']._serialized_end=411
|
|
45
|
+
_globals['_PULLMESSAGESRESPONSE']._serialized_start=414
|
|
46
|
+
_globals['_PULLMESSAGESRESPONSE']._serialized_end=677
|
|
47
|
+
_globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_start=602
|
|
48
|
+
_globals['_PULLMESSAGESRESPONSE_OBJECTSTOPULLENTRY']._serialized_end=677
|
|
49
|
+
_globals['_PUSHMESSAGESREQUEST']._serialized_start=680
|
|
50
|
+
_globals['_PUSHMESSAGESREQUEST']._serialized_end=831
|
|
51
|
+
_globals['_PUSHMESSAGESRESPONSE']._serialized_start=834
|
|
52
|
+
_globals['_PUSHMESSAGESRESPONSE']._serialized_end=1165
|
|
53
|
+
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=1042
|
|
54
|
+
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=1088
|
|
55
|
+
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_start=1090
|
|
56
|
+
_globals['_PUSHMESSAGESRESPONSE_OBJECTSTOPUSHENTRY']._serialized_end=1165
|
|
57
|
+
_globals['_RECONNECT']._serialized_start=1167
|
|
58
|
+
_globals['_RECONNECT']._serialized_end=1197
|
|
59
|
+
_globals['_FLEET']._serialized_start=1200
|
|
60
|
+
_globals['_FLEET']._serialized_end=2042
|
|
56
61
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/fleet_pb2.pyi
CHANGED
|
@@ -16,13 +16,13 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
|
16
16
|
class CreateNodeRequest(google.protobuf.message.Message):
|
|
17
17
|
"""CreateNode messages"""
|
|
18
18
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
|
|
20
|
+
heartbeat_interval: builtins.float
|
|
21
21
|
def __init__(self,
|
|
22
22
|
*,
|
|
23
|
-
|
|
23
|
+
heartbeat_interval: builtins.float = ...,
|
|
24
24
|
) -> None: ...
|
|
25
|
-
def ClearField(self, field_name: typing_extensions.Literal["
|
|
25
|
+
def ClearField(self, field_name: typing_extensions.Literal["heartbeat_interval",b"heartbeat_interval"]) -> None: ...
|
|
26
26
|
global___CreateNodeRequest = CreateNodeRequest
|
|
27
27
|
|
|
28
28
|
class CreateNodeResponse(google.protobuf.message.Message):
|
|
@@ -58,34 +58,6 @@ class DeleteNodeResponse(google.protobuf.message.Message):
|
|
|
58
58
|
) -> None: ...
|
|
59
59
|
global___DeleteNodeResponse = DeleteNodeResponse
|
|
60
60
|
|
|
61
|
-
class PingRequest(google.protobuf.message.Message):
|
|
62
|
-
"""Ping messages"""
|
|
63
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
64
|
-
NODE_FIELD_NUMBER: builtins.int
|
|
65
|
-
PING_INTERVAL_FIELD_NUMBER: builtins.int
|
|
66
|
-
@property
|
|
67
|
-
def node(self) -> flwr.proto.node_pb2.Node: ...
|
|
68
|
-
ping_interval: builtins.float
|
|
69
|
-
def __init__(self,
|
|
70
|
-
*,
|
|
71
|
-
node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
|
|
72
|
-
ping_interval: builtins.float = ...,
|
|
73
|
-
) -> None: ...
|
|
74
|
-
def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
|
|
75
|
-
def ClearField(self, field_name: typing_extensions.Literal["node",b"node","ping_interval",b"ping_interval"]) -> None: ...
|
|
76
|
-
global___PingRequest = PingRequest
|
|
77
|
-
|
|
78
|
-
class PingResponse(google.protobuf.message.Message):
|
|
79
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
80
|
-
SUCCESS_FIELD_NUMBER: builtins.int
|
|
81
|
-
success: builtins.bool
|
|
82
|
-
def __init__(self,
|
|
83
|
-
*,
|
|
84
|
-
success: builtins.bool = ...,
|
|
85
|
-
) -> None: ...
|
|
86
|
-
def ClearField(self, field_name: typing_extensions.Literal["success",b"success"]) -> None: ...
|
|
87
|
-
global___PingResponse = PingResponse
|
|
88
|
-
|
|
89
61
|
class PullMessagesRequest(google.protobuf.message.Message):
|
|
90
62
|
"""PullMessages messages"""
|
|
91
63
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
@@ -106,19 +78,38 @@ global___PullMessagesRequest = PullMessagesRequest
|
|
|
106
78
|
|
|
107
79
|
class PullMessagesResponse(google.protobuf.message.Message):
|
|
108
80
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
81
|
+
class ObjectsToPullEntry(google.protobuf.message.Message):
|
|
82
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
83
|
+
KEY_FIELD_NUMBER: builtins.int
|
|
84
|
+
VALUE_FIELD_NUMBER: builtins.int
|
|
85
|
+
key: typing.Text
|
|
86
|
+
@property
|
|
87
|
+
def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
|
|
88
|
+
def __init__(self,
|
|
89
|
+
*,
|
|
90
|
+
key: typing.Text = ...,
|
|
91
|
+
value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
|
|
92
|
+
) -> None: ...
|
|
93
|
+
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
|
94
|
+
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
95
|
+
|
|
109
96
|
RECONNECT_FIELD_NUMBER: builtins.int
|
|
110
97
|
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
|
98
|
+
OBJECTS_TO_PULL_FIELD_NUMBER: builtins.int
|
|
111
99
|
@property
|
|
112
100
|
def reconnect(self) -> global___Reconnect: ...
|
|
113
101
|
@property
|
|
114
102
|
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
|
103
|
+
@property
|
|
104
|
+
def objects_to_pull(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
|
|
115
105
|
def __init__(self,
|
|
116
106
|
*,
|
|
117
107
|
reconnect: typing.Optional[global___Reconnect] = ...,
|
|
118
108
|
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
|
109
|
+
objects_to_pull: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
|
|
119
110
|
) -> None: ...
|
|
120
111
|
def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
|
|
121
|
-
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","reconnect",b"reconnect"]) -> None: ...
|
|
112
|
+
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","objects_to_pull",b"objects_to_pull","reconnect",b"reconnect"]) -> None: ...
|
|
122
113
|
global___PullMessagesResponse = PullMessagesResponse
|
|
123
114
|
|
|
124
115
|
class PushMessagesRequest(google.protobuf.message.Message):
|
|
@@ -126,17 +117,21 @@ class PushMessagesRequest(google.protobuf.message.Message):
|
|
|
126
117
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
127
118
|
NODE_FIELD_NUMBER: builtins.int
|
|
128
119
|
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
|
120
|
+
MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
|
|
129
121
|
@property
|
|
130
122
|
def node(self) -> flwr.proto.node_pb2.Node: ...
|
|
131
123
|
@property
|
|
132
124
|
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
|
125
|
+
@property
|
|
126
|
+
def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
|
|
133
127
|
def __init__(self,
|
|
134
128
|
*,
|
|
135
129
|
node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
|
|
136
130
|
messages_list: typing.Optional[typing.Iterable[flwr.proto.message_pb2.Message]] = ...,
|
|
131
|
+
message_object_trees: typing.Optional[typing.Iterable[flwr.proto.message_pb2.ObjectTree]] = ...,
|
|
137
132
|
) -> None: ...
|
|
138
133
|
def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
|
|
139
|
-
def ClearField(self, field_name: typing_extensions.Literal["messages_list",b"messages_list","node",b"node"]) -> None: ...
|
|
134
|
+
def ClearField(self, field_name: typing_extensions.Literal["message_object_trees",b"message_object_trees","messages_list",b"messages_list","node",b"node"]) -> None: ...
|
|
140
135
|
global___PushMessagesRequest = PushMessagesRequest
|
|
141
136
|
|
|
142
137
|
class PushMessagesResponse(google.protobuf.message.Message):
|
|
@@ -154,19 +149,38 @@ class PushMessagesResponse(google.protobuf.message.Message):
|
|
|
154
149
|
) -> None: ...
|
|
155
150
|
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
156
151
|
|
|
152
|
+
class ObjectsToPushEntry(google.protobuf.message.Message):
|
|
153
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
154
|
+
KEY_FIELD_NUMBER: builtins.int
|
|
155
|
+
VALUE_FIELD_NUMBER: builtins.int
|
|
156
|
+
key: typing.Text
|
|
157
|
+
@property
|
|
158
|
+
def value(self) -> flwr.proto.message_pb2.ObjectIDs: ...
|
|
159
|
+
def __init__(self,
|
|
160
|
+
*,
|
|
161
|
+
key: typing.Text = ...,
|
|
162
|
+
value: typing.Optional[flwr.proto.message_pb2.ObjectIDs] = ...,
|
|
163
|
+
) -> None: ...
|
|
164
|
+
def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
|
|
165
|
+
def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
|
|
166
|
+
|
|
157
167
|
RECONNECT_FIELD_NUMBER: builtins.int
|
|
158
168
|
RESULTS_FIELD_NUMBER: builtins.int
|
|
169
|
+
OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
|
|
159
170
|
@property
|
|
160
171
|
def reconnect(self) -> global___Reconnect: ...
|
|
161
172
|
@property
|
|
162
173
|
def results(self) -> google.protobuf.internal.containers.ScalarMap[typing.Text, builtins.int]: ...
|
|
174
|
+
@property
|
|
175
|
+
def objects_to_push(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.message_pb2.ObjectIDs]: ...
|
|
163
176
|
def __init__(self,
|
|
164
177
|
*,
|
|
165
178
|
reconnect: typing.Optional[global___Reconnect] = ...,
|
|
166
179
|
results: typing.Optional[typing.Mapping[typing.Text, builtins.int]] = ...,
|
|
180
|
+
objects_to_push: typing.Optional[typing.Mapping[typing.Text, flwr.proto.message_pb2.ObjectIDs]] = ...,
|
|
167
181
|
) -> None: ...
|
|
168
182
|
def HasField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect"]) -> builtins.bool: ...
|
|
169
|
-
def ClearField(self, field_name: typing_extensions.Literal["reconnect",b"reconnect","results",b"results"]) -> None: ...
|
|
183
|
+
def ClearField(self, field_name: typing_extensions.Literal["objects_to_push",b"objects_to_push","reconnect",b"reconnect","results",b"results"]) -> None: ...
|
|
170
184
|
global___PushMessagesResponse = PushMessagesResponse
|
|
171
185
|
|
|
172
186
|
class Reconnect(google.protobuf.message.Message):
|