flwr 1.22.0__py3-none-any.whl → 1.24.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 +16 -5
- flwr/app/error.py +2 -2
- flwr/app/exception.py +3 -3
- flwr/cli/app.py +34 -1
- flwr/cli/app_cmd/__init__.py +23 -0
- flwr/cli/app_cmd/publish.py +285 -0
- flwr/cli/app_cmd/review.py +252 -0
- flwr/cli/auth_plugin/__init__.py +15 -6
- flwr/cli/auth_plugin/auth_plugin.py +94 -0
- flwr/cli/auth_plugin/noop_auth_plugin.py +101 -0
- flwr/cli/auth_plugin/oidc_cli_plugin.py +46 -32
- flwr/cli/build.py +166 -53
- flwr/cli/{cli_user_auth_interceptor.py → cli_account_auth_interceptor.py} +29 -11
- flwr/cli/config_utils.py +101 -13
- flwr/cli/federation/__init__.py +24 -0
- flwr/cli/federation/ls.py +140 -0
- flwr/cli/federation/show.py +317 -0
- flwr/cli/install.py +91 -13
- flwr/cli/log.py +54 -11
- flwr/cli/login/login.py +41 -27
- flwr/cli/ls.py +177 -133
- flwr/cli/new/new.py +175 -40
- flwr/cli/new/templates/app/code/task.pytorch.py.tpl +1 -0
- flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -1
- 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 +3 -3
- flwr/cli/new/templates/app/pyproject.pytorch_legacy_api.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
- flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +2 -2
- flwr/cli/new/templates/app/pyproject.xgboost.toml.tpl +1 -1
- flwr/cli/pull.py +12 -7
- flwr/cli/run/run.py +82 -31
- flwr/cli/run_utils.py +130 -0
- flwr/cli/stop.py +27 -9
- flwr/cli/supernode/__init__.py +25 -0
- flwr/cli/supernode/ls.py +268 -0
- flwr/cli/supernode/register.py +190 -0
- flwr/cli/supernode/unregister.py +140 -0
- flwr/cli/utils.py +464 -81
- flwr/client/__init__.py +2 -1
- flwr/client/dpfedavg_numpy_client.py +4 -1
- flwr/client/grpc_adapter_client/connection.py +12 -15
- flwr/client/grpc_rere_client/connection.py +68 -41
- flwr/client/grpc_rere_client/grpc_adapter.py +34 -14
- flwr/client/grpc_rere_client/{client_interceptor.py → node_auth_client_interceptor.py} +5 -7
- flwr/client/message_handler/message_handler.py +2 -2
- flwr/client/mod/secure_aggregation/secaggplus_mod.py +10 -8
- flwr/client/numpy_client.py +1 -1
- flwr/client/rest_client/connection.py +94 -51
- flwr/client/run_info_store.py +4 -5
- flwr/client/typing.py +1 -1
- flwr/clientapp/__init__.py +1 -2
- flwr/{client → clientapp}/client_app.py +9 -10
- flwr/clientapp/mod/centraldp_mods.py +16 -17
- flwr/clientapp/mod/localdp_mod.py +8 -9
- flwr/clientapp/typing.py +1 -1
- flwr/{client/clientapp → clientapp}/utils.py +4 -4
- flwr/common/address.py +1 -2
- flwr/common/args.py +3 -4
- flwr/common/config.py +13 -16
- flwr/common/constant.py +56 -13
- flwr/common/differential_privacy.py +3 -4
- flwr/common/event_log_plugin/event_log_plugin.py +3 -4
- flwr/common/exit/exit.py +15 -2
- flwr/common/exit/exit_code.py +39 -10
- flwr/common/exit/exit_handler.py +6 -2
- flwr/common/exit/signal_handler.py +5 -5
- flwr/common/grpc.py +6 -6
- flwr/common/inflatable_protobuf_utils.py +1 -1
- flwr/common/inflatable_utils.py +48 -31
- flwr/common/logger.py +19 -19
- flwr/common/message.py +4 -4
- flwr/common/object_ref.py +7 -7
- flwr/common/record/array.py +6 -6
- flwr/common/record/arrayrecord.py +18 -21
- flwr/common/record/configrecord.py +3 -3
- flwr/common/record/recorddict.py +5 -5
- flwr/common/record/typeddict.py +9 -2
- flwr/common/recorddict_compat.py +7 -10
- flwr/common/retry_invoker.py +20 -20
- flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -89
- flwr/common/secure_aggregation/ndarrays_arithmetic.py +3 -3
- flwr/common/serde.py +9 -6
- flwr/common/serde_utils.py +2 -2
- flwr/common/telemetry.py +9 -5
- flwr/common/typing.py +59 -43
- flwr/compat/client/app.py +39 -38
- flwr/compat/client/grpc_client/connection.py +13 -13
- flwr/compat/server/app.py +5 -6
- flwr/proto/appio_pb2.py +13 -3
- flwr/proto/appio_pb2.pyi +134 -65
- flwr/proto/appio_pb2_grpc.py +20 -0
- flwr/proto/appio_pb2_grpc.pyi +27 -0
- flwr/proto/clientappio_pb2.py +17 -7
- flwr/proto/clientappio_pb2.pyi +15 -0
- flwr/proto/clientappio_pb2_grpc.py +206 -40
- flwr/proto/clientappio_pb2_grpc.pyi +168 -53
- flwr/proto/control_pb2.py +72 -40
- flwr/proto/control_pb2.pyi +319 -87
- flwr/proto/control_pb2_grpc.py +339 -28
- flwr/proto/control_pb2_grpc.pyi +209 -37
- flwr/proto/error_pb2.py +13 -3
- flwr/proto/error_pb2.pyi +24 -6
- flwr/proto/error_pb2_grpc.py +20 -0
- flwr/proto/error_pb2_grpc.pyi +27 -0
- flwr/proto/fab_pb2.py +24 -10
- flwr/proto/fab_pb2.pyi +68 -20
- flwr/proto/fab_pb2_grpc.py +20 -0
- flwr/proto/fab_pb2_grpc.pyi +27 -0
- flwr/proto/federation_pb2.py +38 -0
- flwr/proto/federation_pb2.pyi +56 -0
- flwr/proto/federation_pb2_grpc.py +24 -0
- flwr/proto/federation_pb2_grpc.pyi +31 -0
- flwr/proto/fleet_pb2.py +45 -27
- flwr/proto/fleet_pb2.pyi +186 -70
- flwr/proto/fleet_pb2_grpc.py +277 -66
- flwr/proto/fleet_pb2_grpc.pyi +201 -55
- flwr/proto/grpcadapter_pb2.py +14 -4
- flwr/proto/grpcadapter_pb2.pyi +38 -16
- flwr/proto/grpcadapter_pb2_grpc.py +35 -4
- flwr/proto/grpcadapter_pb2_grpc.pyi +38 -7
- flwr/proto/heartbeat_pb2.py +17 -7
- flwr/proto/heartbeat_pb2.pyi +51 -22
- flwr/proto/heartbeat_pb2_grpc.py +20 -0
- flwr/proto/heartbeat_pb2_grpc.pyi +27 -0
- flwr/proto/log_pb2.py +13 -3
- flwr/proto/log_pb2.pyi +34 -11
- flwr/proto/log_pb2_grpc.py +20 -0
- flwr/proto/log_pb2_grpc.pyi +27 -0
- flwr/proto/message_pb2.py +15 -5
- flwr/proto/message_pb2.pyi +154 -86
- flwr/proto/message_pb2_grpc.py +20 -0
- flwr/proto/message_pb2_grpc.pyi +27 -0
- flwr/proto/node_pb2.py +16 -4
- flwr/proto/node_pb2.pyi +77 -4
- flwr/proto/node_pb2_grpc.py +20 -0
- flwr/proto/node_pb2_grpc.pyi +27 -0
- flwr/proto/recorddict_pb2.py +13 -3
- flwr/proto/recorddict_pb2.pyi +184 -107
- flwr/proto/recorddict_pb2_grpc.py +20 -0
- flwr/proto/recorddict_pb2_grpc.pyi +27 -0
- flwr/proto/run_pb2.py +40 -31
- flwr/proto/run_pb2.pyi +149 -84
- flwr/proto/run_pb2_grpc.py +20 -0
- flwr/proto/run_pb2_grpc.pyi +27 -0
- flwr/proto/serverappio_pb2.py +13 -3
- flwr/proto/serverappio_pb2.pyi +32 -8
- flwr/proto/serverappio_pb2_grpc.py +246 -65
- flwr/proto/serverappio_pb2_grpc.pyi +221 -85
- flwr/proto/simulationio_pb2.py +16 -8
- flwr/proto/simulationio_pb2.pyi +15 -0
- flwr/proto/simulationio_pb2_grpc.py +162 -41
- flwr/proto/simulationio_pb2_grpc.pyi +149 -55
- flwr/proto/transport_pb2.py +20 -10
- flwr/proto/transport_pb2.pyi +249 -160
- flwr/proto/transport_pb2_grpc.py +35 -4
- flwr/proto/transport_pb2_grpc.pyi +38 -8
- flwr/server/app.py +173 -127
- flwr/server/client_manager.py +4 -5
- flwr/server/client_proxy.py +10 -11
- flwr/server/compat/app.py +4 -5
- flwr/server/compat/app_utils.py +2 -1
- flwr/server/compat/grid_client_proxy.py +10 -12
- flwr/server/compat/legacy_context.py +3 -4
- flwr/server/fleet_event_log_interceptor.py +2 -1
- flwr/server/grid/grid.py +2 -3
- flwr/server/grid/grpc_grid.py +10 -8
- flwr/server/grid/inmemory_grid.py +4 -4
- flwr/server/run_serverapp.py +2 -3
- flwr/server/server.py +34 -39
- flwr/server/server_app.py +7 -8
- flwr/server/server_config.py +1 -2
- flwr/server/serverapp/app.py +34 -28
- flwr/server/serverapp_components.py +4 -5
- flwr/server/strategy/aggregate.py +9 -8
- flwr/server/strategy/bulyan.py +13 -11
- flwr/server/strategy/dp_adaptive_clipping.py +16 -20
- flwr/server/strategy/dp_fixed_clipping.py +12 -17
- flwr/server/strategy/dpfedavg_adaptive.py +3 -4
- flwr/server/strategy/dpfedavg_fixed.py +6 -10
- flwr/server/strategy/fault_tolerant_fedavg.py +14 -13
- flwr/server/strategy/fedadagrad.py +18 -14
- flwr/server/strategy/fedadam.py +16 -14
- flwr/server/strategy/fedavg.py +16 -17
- flwr/server/strategy/fedavg_android.py +15 -15
- flwr/server/strategy/fedavgm.py +21 -18
- flwr/server/strategy/fedmedian.py +2 -3
- flwr/server/strategy/fedopt.py +11 -10
- flwr/server/strategy/fedprox.py +10 -9
- flwr/server/strategy/fedtrimmedavg.py +12 -11
- flwr/server/strategy/fedxgb_bagging.py +13 -11
- flwr/server/strategy/fedxgb_cyclic.py +6 -6
- flwr/server/strategy/fedxgb_nn_avg.py +4 -4
- flwr/server/strategy/fedyogi.py +16 -14
- flwr/server/strategy/krum.py +12 -11
- flwr/server/strategy/qfedavg.py +16 -15
- flwr/server/strategy/strategy.py +6 -9
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +19 -8
- flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -2
- flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +3 -4
- flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +10 -12
- flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +1 -3
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +136 -42
- flwr/server/superlink/fleet/grpc_rere/{server_interceptor.py → node_auth_server_interceptor.py} +28 -51
- flwr/server/superlink/fleet/message_handler/message_handler.py +100 -49
- flwr/server/superlink/fleet/rest_rere/rest_api.py +54 -33
- flwr/server/superlink/fleet/vce/backend/backend.py +2 -2
- flwr/server/superlink/fleet/vce/backend/raybackend.py +6 -6
- flwr/server/superlink/fleet/vce/vce_api.py +32 -13
- flwr/server/superlink/linkstate/in_memory_linkstate.py +266 -207
- flwr/server/superlink/linkstate/linkstate.py +161 -62
- flwr/server/superlink/linkstate/linkstate_factory.py +24 -6
- flwr/server/superlink/linkstate/sqlite_linkstate.py +698 -638
- flwr/server/superlink/linkstate/utils.py +9 -60
- flwr/server/superlink/serverappio/serverappio_grpc.py +1 -2
- flwr/server/superlink/serverappio/serverappio_servicer.py +28 -23
- flwr/server/superlink/simulation/simulationio_grpc.py +1 -2
- flwr/server/superlink/simulation/simulationio_servicer.py +19 -14
- flwr/server/superlink/utils.py +4 -6
- flwr/server/typing.py +1 -1
- flwr/server/utils/tensorboard.py +15 -8
- flwr/server/utils/validator.py +2 -3
- flwr/server/workflow/default_workflows.py +5 -5
- flwr/server/workflow/secure_aggregation/secagg_workflow.py +2 -4
- flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +12 -10
- flwr/serverapp/strategy/bulyan.py +16 -15
- flwr/serverapp/strategy/dp_adaptive_clipping.py +12 -11
- flwr/serverapp/strategy/dp_fixed_clipping.py +11 -14
- flwr/serverapp/strategy/fedadagrad.py +10 -11
- flwr/serverapp/strategy/fedadam.py +10 -11
- flwr/serverapp/strategy/fedavg.py +9 -10
- flwr/serverapp/strategy/fedavgm.py +17 -16
- flwr/serverapp/strategy/fedmedian.py +2 -2
- flwr/serverapp/strategy/fedopt.py +10 -11
- flwr/serverapp/strategy/fedprox.py +7 -8
- flwr/serverapp/strategy/fedtrimmedavg.py +9 -9
- flwr/serverapp/strategy/fedxgb_bagging.py +3 -3
- flwr/serverapp/strategy/fedxgb_cyclic.py +9 -9
- flwr/serverapp/strategy/fedyogi.py +9 -11
- flwr/serverapp/strategy/krum.py +7 -7
- flwr/serverapp/strategy/multikrum.py +9 -9
- flwr/serverapp/strategy/qfedavg.py +17 -16
- flwr/serverapp/strategy/strategy.py +6 -9
- flwr/serverapp/strategy/strategy_utils.py +7 -8
- flwr/simulation/app.py +46 -42
- flwr/simulation/legacy_app.py +12 -12
- flwr/simulation/ray_transport/ray_actor.py +11 -12
- flwr/simulation/ray_transport/ray_client_proxy.py +12 -13
- flwr/simulation/run_simulation.py +44 -43
- flwr/simulation/simulationio_connection.py +4 -4
- flwr/supercore/cli/flower_superexec.py +3 -4
- flwr/supercore/constant.py +52 -0
- flwr/supercore/corestate/corestate.py +24 -3
- flwr/supercore/corestate/in_memory_corestate.py +138 -0
- flwr/supercore/corestate/sqlite_corestate.py +157 -0
- flwr/supercore/ffs/disk_ffs.py +1 -2
- flwr/supercore/ffs/ffs.py +1 -2
- flwr/supercore/ffs/ffs_factory.py +1 -2
- flwr/{common → supercore}/heartbeat.py +20 -25
- flwr/supercore/object_store/in_memory_object_store.py +1 -6
- flwr/supercore/object_store/object_store.py +1 -2
- flwr/supercore/object_store/object_store_factory.py +27 -8
- flwr/supercore/object_store/sqlite_object_store.py +253 -0
- flwr/{client/clientapp → supercore/primitives}/__init__.py +1 -1
- flwr/supercore/primitives/asymmetric.py +117 -0
- flwr/supercore/primitives/asymmetric_ed25519.py +175 -0
- flwr/supercore/sqlite_mixin.py +159 -0
- flwr/supercore/superexec/plugin/base_exec_plugin.py +1 -2
- flwr/supercore/superexec/plugin/exec_plugin.py +3 -3
- flwr/supercore/superexec/run_superexec.py +9 -13
- flwr/supercore/utils.py +20 -0
- flwr/superlink/artifact_provider/artifact_provider.py +1 -2
- flwr/{common → superlink}/auth_plugin/__init__.py +6 -6
- flwr/superlink/auth_plugin/auth_plugin.py +88 -0
- flwr/superlink/auth_plugin/noop_auth_plugin.py +84 -0
- flwr/superlink/federation/__init__.py +24 -0
- flwr/superlink/federation/federation_manager.py +64 -0
- flwr/superlink/federation/noop_federation_manager.py +71 -0
- flwr/superlink/servicer/control/{control_user_auth_interceptor.py → control_account_auth_interceptor.py} +41 -32
- flwr/superlink/servicer/control/control_event_log_interceptor.py +7 -7
- flwr/superlink/servicer/control/control_grpc.py +18 -17
- flwr/superlink/servicer/control/control_license_interceptor.py +3 -3
- flwr/superlink/servicer/control/control_servicer.py +239 -63
- flwr/supernode/cli/flower_supernode.py +74 -26
- flwr/supernode/nodestate/in_memory_nodestate.py +60 -49
- flwr/supernode/nodestate/nodestate.py +7 -8
- flwr/supernode/nodestate/nodestate_factory.py +7 -4
- flwr/supernode/runtime/run_clientapp.py +43 -24
- flwr/supernode/servicer/clientappio/clientappio_servicer.py +40 -10
- flwr/supernode/start_client_internal.py +175 -51
- {flwr-1.22.0.dist-info → flwr-1.24.0.dist-info}/METADATA +8 -8
- flwr-1.24.0.dist-info/RECORD +454 -0
- flwr/common/auth_plugin/auth_plugin.py +0 -149
- flwr/supercore/object_store/utils.py +0 -43
- flwr-1.22.0.dist-info/RECORD +0 -428
- {flwr-1.22.0.dist-info → flwr-1.24.0.dist-info}/WHEEL +0 -0
- {flwr-1.22.0.dist-info → flwr-1.24.0.dist-info}/entry_points.txt +0 -0
flwr/compat/client/app.py
CHANGED
|
@@ -16,10 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import time
|
|
19
|
+
from collections.abc import Callable
|
|
19
20
|
from contextlib import AbstractContextManager
|
|
20
21
|
from logging import ERROR, INFO, WARN
|
|
21
22
|
from pathlib import Path
|
|
22
|
-
from typing import Callable, Optional, Union
|
|
23
23
|
|
|
24
24
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
25
25
|
from grpc import RpcError
|
|
@@ -28,11 +28,11 @@ from flwr.app.error import Error
|
|
|
28
28
|
from flwr.cli.config_utils import get_fab_metadata
|
|
29
29
|
from flwr.cli.install import install_from_fab
|
|
30
30
|
from flwr.client.client import Client
|
|
31
|
-
from flwr.client.client_app import ClientApp, LoadClientAppError
|
|
32
31
|
from flwr.client.message_handler.message_handler import handle_control_message
|
|
33
32
|
from flwr.client.numpy_client import NumPyClient
|
|
34
33
|
from flwr.client.run_info_store import DeprecatedRunInfoStore
|
|
35
34
|
from flwr.client.typing import ClientFnExt
|
|
35
|
+
from flwr.clientapp.client_app import ClientApp, LoadClientAppError
|
|
36
36
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, Context, EventType, Message, event
|
|
37
37
|
from flwr.common.address import parse_address
|
|
38
38
|
from flwr.common.constant import (
|
|
@@ -46,11 +46,12 @@ from flwr.common.logger import log, warn_deprecated_feature
|
|
|
46
46
|
from flwr.common.retry_invoker import RetryInvoker, RetryState, exponential
|
|
47
47
|
from flwr.common.typing import Fab, Run, RunNotRunningException, UserConfig
|
|
48
48
|
from flwr.compat.client.grpc_client.connection import grpc_connection
|
|
49
|
+
from flwr.supercore.object_store import ObjectStoreFactory
|
|
49
50
|
from flwr.supernode.nodestate import NodeStateFactory
|
|
50
51
|
|
|
51
52
|
|
|
52
53
|
def _check_actionable_client(
|
|
53
|
-
client:
|
|
54
|
+
client: Client | None, client_fn: ClientFnExt | None
|
|
54
55
|
) -> None:
|
|
55
56
|
if client_fn is None and client is None:
|
|
56
57
|
raise ValueError(
|
|
@@ -71,17 +72,17 @@ def _check_actionable_client(
|
|
|
71
72
|
def start_client(
|
|
72
73
|
*,
|
|
73
74
|
server_address: str,
|
|
74
|
-
client_fn:
|
|
75
|
-
client:
|
|
75
|
+
client_fn: ClientFnExt | None = None,
|
|
76
|
+
client: Client | None = None,
|
|
76
77
|
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
77
|
-
root_certificates:
|
|
78
|
-
insecure:
|
|
79
|
-
transport:
|
|
80
|
-
authentication_keys:
|
|
81
|
-
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
|
82
|
-
|
|
83
|
-
max_retries:
|
|
84
|
-
max_wait_time:
|
|
78
|
+
root_certificates: bytes | str | None = None,
|
|
79
|
+
insecure: bool | None = None,
|
|
80
|
+
transport: str | None = None,
|
|
81
|
+
authentication_keys: (
|
|
82
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
|
|
83
|
+
) = None,
|
|
84
|
+
max_retries: int | None = None,
|
|
85
|
+
max_wait_time: float | None = None,
|
|
85
86
|
) -> None:
|
|
86
87
|
"""Start a Flower client node which connects to a Flower server.
|
|
87
88
|
|
|
@@ -205,19 +206,19 @@ def start_client_internal(
|
|
|
205
206
|
*,
|
|
206
207
|
server_address: str,
|
|
207
208
|
node_config: UserConfig,
|
|
208
|
-
load_client_app_fn:
|
|
209
|
-
client_fn:
|
|
210
|
-
client:
|
|
209
|
+
load_client_app_fn: Callable[[str, str, str], ClientApp] | None = None,
|
|
210
|
+
client_fn: ClientFnExt | None = None,
|
|
211
|
+
client: Client | None = None,
|
|
211
212
|
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
212
|
-
root_certificates:
|
|
213
|
-
insecure:
|
|
214
|
-
transport:
|
|
215
|
-
authentication_keys:
|
|
216
|
-
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
|
217
|
-
|
|
218
|
-
max_retries:
|
|
219
|
-
max_wait_time:
|
|
220
|
-
flwr_path:
|
|
213
|
+
root_certificates: bytes | str | None = None,
|
|
214
|
+
insecure: bool | None = None,
|
|
215
|
+
transport: str | None = None,
|
|
216
|
+
authentication_keys: (
|
|
217
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
|
|
218
|
+
) = None,
|
|
219
|
+
max_retries: int | None = None,
|
|
220
|
+
max_wait_time: float | None = None,
|
|
221
|
+
flwr_path: Path | None = None,
|
|
221
222
|
) -> None:
|
|
222
223
|
"""Start a Flower client node which connects to a Flower server.
|
|
223
224
|
|
|
@@ -342,8 +343,8 @@ def start_client_internal(
|
|
|
342
343
|
)
|
|
343
344
|
|
|
344
345
|
# DeprecatedRunInfoStore gets initialized when the first connection is established
|
|
345
|
-
run_info_store:
|
|
346
|
-
state_factory = NodeStateFactory()
|
|
346
|
+
run_info_store: DeprecatedRunInfoStore | None = None
|
|
347
|
+
state_factory = NodeStateFactory(objectstore_factory=ObjectStoreFactory())
|
|
347
348
|
state = state_factory.state()
|
|
348
349
|
|
|
349
350
|
runs: dict[int, Run] = {}
|
|
@@ -537,9 +538,9 @@ def start_numpy_client(
|
|
|
537
538
|
server_address: str,
|
|
538
539
|
client: NumPyClient,
|
|
539
540
|
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
540
|
-
root_certificates:
|
|
541
|
-
insecure:
|
|
542
|
-
transport:
|
|
541
|
+
root_certificates: bytes | None = None,
|
|
542
|
+
insecure: bool | None = None,
|
|
543
|
+
transport: str | None = None,
|
|
543
544
|
) -> None:
|
|
544
545
|
"""Start a Flower NumPyClient which connects to a gRPC server.
|
|
545
546
|
|
|
@@ -631,24 +632,24 @@ def start_numpy_client(
|
|
|
631
632
|
)
|
|
632
633
|
|
|
633
634
|
|
|
634
|
-
def _init_connection(transport:
|
|
635
|
+
def _init_connection(transport: str | None, server_address: str) -> tuple[
|
|
635
636
|
Callable[
|
|
636
637
|
[
|
|
637
638
|
str,
|
|
638
639
|
bool,
|
|
639
640
|
RetryInvoker,
|
|
640
641
|
int,
|
|
641
|
-
|
|
642
|
-
|
|
642
|
+
bytes | str | None,
|
|
643
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None,
|
|
643
644
|
],
|
|
644
645
|
AbstractContextManager[
|
|
645
646
|
tuple[
|
|
646
|
-
Callable[[],
|
|
647
|
+
Callable[[], Message | None],
|
|
647
648
|
Callable[[Message], None],
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
649
|
+
Callable[[], int | None] | None,
|
|
650
|
+
Callable[[], None] | None,
|
|
651
|
+
Callable[[int], Run] | None,
|
|
652
|
+
Callable[[str, int], Fab] | None,
|
|
652
653
|
]
|
|
653
654
|
],
|
|
654
655
|
],
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
import uuid
|
|
19
|
-
from collections.abc import Iterator
|
|
19
|
+
from collections.abc import Callable, Iterator
|
|
20
20
|
from contextlib import contextmanager
|
|
21
21
|
from logging import DEBUG, ERROR
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
from queue import Queue
|
|
24
|
-
from typing import
|
|
24
|
+
from typing import cast
|
|
25
25
|
|
|
26
26
|
from cryptography.hazmat.primitives.asymmetric import ec
|
|
27
27
|
|
|
@@ -56,18 +56,18 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
|
|
|
56
56
|
insecure: bool,
|
|
57
57
|
retry_invoker: RetryInvoker, # pylint: disable=unused-argument
|
|
58
58
|
max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
59
|
-
root_certificates:
|
|
60
|
-
authentication_keys:
|
|
61
|
-
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey]
|
|
62
|
-
|
|
59
|
+
root_certificates: bytes | str | None = None,
|
|
60
|
+
authentication_keys: (
|
|
61
|
+
tuple[ec.EllipticCurvePrivateKey, ec.EllipticCurvePublicKey] | None
|
|
62
|
+
) = None,
|
|
63
63
|
) -> Iterator[
|
|
64
64
|
tuple[
|
|
65
|
-
Callable[[],
|
|
65
|
+
Callable[[], Message | None],
|
|
66
66
|
Callable[[Message], None],
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
Callable[[], int | None] | None,
|
|
68
|
+
Callable[[], None] | None,
|
|
69
|
+
Callable[[int], Run] | None,
|
|
70
|
+
Callable[[str, int], Fab] | None,
|
|
71
71
|
]
|
|
72
72
|
]:
|
|
73
73
|
"""Establish a gRPC connection to a gRPC server.
|
|
@@ -96,7 +96,7 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
|
|
|
96
96
|
If provided, a secure connection using the certificates will be
|
|
97
97
|
established to an SSL-enabled Flower server.
|
|
98
98
|
authentication_keys : Optional[Tuple[PrivateKey, PublicKey]] (default: None)
|
|
99
|
-
|
|
99
|
+
SuperNode authentication is not supported for this transport type.
|
|
100
100
|
|
|
101
101
|
Returns
|
|
102
102
|
-------
|
|
@@ -120,7 +120,7 @@ def grpc_connection( # pylint: disable=R0913,R0915,too-many-positional-argument
|
|
|
120
120
|
if isinstance(root_certificates, str):
|
|
121
121
|
root_certificates = Path(root_certificates).read_bytes()
|
|
122
122
|
if authentication_keys is not None:
|
|
123
|
-
log(ERROR, "
|
|
123
|
+
log(ERROR, "SuperNode authentication is not supported for this transport type.")
|
|
124
124
|
|
|
125
125
|
channel = create_channel(
|
|
126
126
|
server_address=server_address,
|
flwr/compat/server/app.py
CHANGED
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
|
|
18
18
|
import sys
|
|
19
19
|
from logging import INFO
|
|
20
|
-
from typing import Optional
|
|
21
20
|
|
|
22
21
|
from flwr.common import GRPC_MAX_MESSAGE_LENGTH, EventType, event
|
|
23
22
|
from flwr.common.address import parse_address
|
|
@@ -35,12 +34,12 @@ from flwr.server.superlink.fleet.grpc_bidi.grpc_server import start_grpc_server
|
|
|
35
34
|
def start_server( # pylint: disable=too-many-arguments,too-many-locals
|
|
36
35
|
*,
|
|
37
36
|
server_address: str = FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS,
|
|
38
|
-
server:
|
|
39
|
-
config:
|
|
40
|
-
strategy:
|
|
41
|
-
client_manager:
|
|
37
|
+
server: Server | None = None,
|
|
38
|
+
config: ServerConfig | None = None,
|
|
39
|
+
strategy: Strategy | None = None,
|
|
40
|
+
client_manager: ClientManager | None = None,
|
|
42
41
|
grpc_max_message_length: int = GRPC_MAX_MESSAGE_LENGTH,
|
|
43
|
-
certificates:
|
|
42
|
+
certificates: tuple[bytes, bytes, bytes] | None = None,
|
|
44
43
|
) -> History:
|
|
45
44
|
"""Start a Flower server using the gRPC transport layer.
|
|
46
45
|
|
flwr/proto/appio_pb2.py
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# NO CHECKED-IN PROTOBUF GENCODE
|
|
3
4
|
# source: flwr/proto/appio.proto
|
|
4
|
-
# Protobuf Python Version:
|
|
5
|
+
# Protobuf Python Version: 5.29.0
|
|
5
6
|
"""Generated protocol buffer code."""
|
|
6
7
|
from google.protobuf import descriptor as _descriptor
|
|
7
8
|
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
9
|
+
from google.protobuf import runtime_version as _runtime_version
|
|
8
10
|
from google.protobuf import symbol_database as _symbol_database
|
|
9
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/appio.proto'
|
|
19
|
+
)
|
|
10
20
|
# @@protoc_insertion_point(imports)
|
|
11
21
|
|
|
12
22
|
_sym_db = _symbol_database.Default()
|
|
@@ -22,8 +32,8 @@ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/
|
|
|
22
32
|
_globals = globals()
|
|
23
33
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
24
34
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.appio_pb2', _globals)
|
|
25
|
-
if _descriptor._USE_C_DESCRIPTORS
|
|
26
|
-
DESCRIPTOR.
|
|
35
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
|
36
|
+
DESCRIPTOR._loaded_options = None
|
|
27
37
|
_globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_start=108
|
|
28
38
|
_globals['_LISTAPPSTOLAUNCHREQUEST']._serialized_end=133
|
|
29
39
|
_globals['_LISTAPPSTOLAUNCHRESPONSE']._serialized_start=135
|
flwr/proto/appio_pb2.pyi
CHANGED
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
"""
|
|
2
2
|
@generated by mypy-protobuf. Do not edit manually!
|
|
3
3
|
isort:skip_file
|
|
4
|
+
Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
you may not use this file except in compliance with the License.
|
|
8
|
+
You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
==============================================================================
|
|
4
18
|
"""
|
|
19
|
+
|
|
5
20
|
import builtins
|
|
21
|
+
import collections.abc
|
|
6
22
|
import flwr.proto.fab_pb2
|
|
7
23
|
import flwr.proto.message_pb2
|
|
8
24
|
import flwr.proto.run_pb2
|
|
@@ -10,145 +26,187 @@ import google.protobuf.descriptor
|
|
|
10
26
|
import google.protobuf.internal.containers
|
|
11
27
|
import google.protobuf.message
|
|
12
28
|
import typing
|
|
13
|
-
import typing_extensions
|
|
14
29
|
|
|
15
30
|
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
16
31
|
|
|
32
|
+
@typing.final
|
|
17
33
|
class ListAppsToLaunchRequest(google.protobuf.message.Message):
|
|
18
34
|
"""These messages are used by both ServerAppIo and ClientAppIo services
|
|
19
35
|
|
|
20
36
|
ListAppsToLaunch messages
|
|
21
37
|
"""
|
|
38
|
+
|
|
22
39
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
23
|
-
|
|
24
|
-
|
|
40
|
+
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
) -> None: ...
|
|
44
|
+
|
|
25
45
|
global___ListAppsToLaunchRequest = ListAppsToLaunchRequest
|
|
26
46
|
|
|
47
|
+
@typing.final
|
|
27
48
|
class ListAppsToLaunchResponse(google.protobuf.message.Message):
|
|
28
49
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
50
|
+
|
|
29
51
|
RUN_IDS_FIELD_NUMBER: builtins.int
|
|
30
52
|
@property
|
|
31
53
|
def run_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
|
|
32
54
|
"""List of run IDs of the apps to launch"""
|
|
33
|
-
|
|
34
|
-
def __init__(
|
|
55
|
+
|
|
56
|
+
def __init__(
|
|
57
|
+
self,
|
|
35
58
|
*,
|
|
36
|
-
run_ids:
|
|
37
|
-
|
|
38
|
-
def ClearField(self, field_name:
|
|
59
|
+
run_ids: collections.abc.Iterable[builtins.int] | None = ...,
|
|
60
|
+
) -> None: ...
|
|
61
|
+
def ClearField(self, field_name: typing.Literal["run_ids", b"run_ids"]) -> None: ...
|
|
62
|
+
|
|
39
63
|
global___ListAppsToLaunchResponse = ListAppsToLaunchResponse
|
|
40
64
|
|
|
65
|
+
@typing.final
|
|
41
66
|
class RequestTokenRequest(google.protobuf.message.Message):
|
|
42
67
|
"""RequestToken messages"""
|
|
68
|
+
|
|
43
69
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
70
|
+
|
|
44
71
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
45
72
|
run_id: builtins.int
|
|
46
|
-
def __init__(
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
47
75
|
*,
|
|
48
76
|
run_id: builtins.int = ...,
|
|
49
|
-
|
|
50
|
-
def ClearField(self, field_name:
|
|
77
|
+
) -> None: ...
|
|
78
|
+
def ClearField(self, field_name: typing.Literal["run_id", b"run_id"]) -> None: ...
|
|
79
|
+
|
|
51
80
|
global___RequestTokenRequest = RequestTokenRequest
|
|
52
81
|
|
|
82
|
+
@typing.final
|
|
53
83
|
class RequestTokenResponse(google.protobuf.message.Message):
|
|
54
84
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
85
|
+
|
|
55
86
|
TOKEN_FIELD_NUMBER: builtins.int
|
|
56
|
-
token:
|
|
57
|
-
def __init__(
|
|
87
|
+
token: builtins.str
|
|
88
|
+
def __init__(
|
|
89
|
+
self,
|
|
58
90
|
*,
|
|
59
|
-
token:
|
|
60
|
-
|
|
61
|
-
def ClearField(self, field_name:
|
|
91
|
+
token: builtins.str = ...,
|
|
92
|
+
) -> None: ...
|
|
93
|
+
def ClearField(self, field_name: typing.Literal["token", b"token"]) -> None: ...
|
|
94
|
+
|
|
62
95
|
global___RequestTokenResponse = RequestTokenResponse
|
|
63
96
|
|
|
97
|
+
@typing.final
|
|
64
98
|
class PushAppMessagesRequest(google.protobuf.message.Message):
|
|
65
99
|
"""PushAppMessages messages"""
|
|
100
|
+
|
|
66
101
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
102
|
+
|
|
67
103
|
TOKEN_FIELD_NUMBER: builtins.int
|
|
68
104
|
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
|
69
105
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
70
106
|
MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
|
|
71
|
-
token:
|
|
107
|
+
token: builtins.str
|
|
108
|
+
run_id: builtins.int
|
|
72
109
|
@property
|
|
73
110
|
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
|
74
|
-
run_id: builtins.int
|
|
75
111
|
@property
|
|
76
112
|
def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
|
|
77
|
-
def __init__(
|
|
113
|
+
def __init__(
|
|
114
|
+
self,
|
|
78
115
|
*,
|
|
79
|
-
token:
|
|
80
|
-
messages_list:
|
|
116
|
+
token: builtins.str = ...,
|
|
117
|
+
messages_list: collections.abc.Iterable[flwr.proto.message_pb2.Message] | None = ...,
|
|
81
118
|
run_id: builtins.int = ...,
|
|
82
|
-
message_object_trees:
|
|
83
|
-
|
|
84
|
-
def ClearField(self, field_name:
|
|
119
|
+
message_object_trees: collections.abc.Iterable[flwr.proto.message_pb2.ObjectTree] | None = ...,
|
|
120
|
+
) -> None: ...
|
|
121
|
+
def ClearField(self, field_name: typing.Literal["message_object_trees", b"message_object_trees", "messages_list", b"messages_list", "run_id", b"run_id", "token", b"token"]) -> None: ...
|
|
122
|
+
|
|
85
123
|
global___PushAppMessagesRequest = PushAppMessagesRequest
|
|
86
124
|
|
|
125
|
+
@typing.final
|
|
87
126
|
class PushAppMessagesResponse(google.protobuf.message.Message):
|
|
88
127
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
128
|
+
|
|
89
129
|
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
|
90
130
|
OBJECTS_TO_PUSH_FIELD_NUMBER: builtins.int
|
|
91
131
|
@property
|
|
92
|
-
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[
|
|
132
|
+
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
|
|
93
133
|
@property
|
|
94
|
-
def objects_to_push(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[
|
|
95
|
-
def __init__(
|
|
134
|
+
def objects_to_push(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
|
|
135
|
+
def __init__(
|
|
136
|
+
self,
|
|
96
137
|
*,
|
|
97
|
-
message_ids:
|
|
98
|
-
objects_to_push:
|
|
99
|
-
|
|
100
|
-
def ClearField(self, field_name:
|
|
138
|
+
message_ids: collections.abc.Iterable[builtins.str] | None = ...,
|
|
139
|
+
objects_to_push: collections.abc.Iterable[builtins.str] | None = ...,
|
|
140
|
+
) -> None: ...
|
|
141
|
+
def ClearField(self, field_name: typing.Literal["message_ids", b"message_ids", "objects_to_push", b"objects_to_push"]) -> None: ...
|
|
142
|
+
|
|
101
143
|
global___PushAppMessagesResponse = PushAppMessagesResponse
|
|
102
144
|
|
|
145
|
+
@typing.final
|
|
103
146
|
class PullAppMessagesRequest(google.protobuf.message.Message):
|
|
104
147
|
"""PullAppMessages messages"""
|
|
148
|
+
|
|
105
149
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
150
|
+
|
|
106
151
|
TOKEN_FIELD_NUMBER: builtins.int
|
|
107
152
|
MESSAGE_IDS_FIELD_NUMBER: builtins.int
|
|
108
153
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
109
|
-
token:
|
|
110
|
-
@property
|
|
111
|
-
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
|
|
154
|
+
token: builtins.str
|
|
112
155
|
run_id: builtins.int
|
|
113
|
-
|
|
156
|
+
@property
|
|
157
|
+
def message_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ...
|
|
158
|
+
def __init__(
|
|
159
|
+
self,
|
|
114
160
|
*,
|
|
115
|
-
token:
|
|
116
|
-
message_ids:
|
|
161
|
+
token: builtins.str = ...,
|
|
162
|
+
message_ids: collections.abc.Iterable[builtins.str] | None = ...,
|
|
117
163
|
run_id: builtins.int = ...,
|
|
118
|
-
|
|
119
|
-
def ClearField(self, field_name:
|
|
164
|
+
) -> None: ...
|
|
165
|
+
def ClearField(self, field_name: typing.Literal["message_ids", b"message_ids", "run_id", b"run_id", "token", b"token"]) -> None: ...
|
|
166
|
+
|
|
120
167
|
global___PullAppMessagesRequest = PullAppMessagesRequest
|
|
121
168
|
|
|
169
|
+
@typing.final
|
|
122
170
|
class PullAppMessagesResponse(google.protobuf.message.Message):
|
|
123
171
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
172
|
+
|
|
124
173
|
MESSAGES_LIST_FIELD_NUMBER: builtins.int
|
|
125
174
|
MESSAGE_OBJECT_TREES_FIELD_NUMBER: builtins.int
|
|
126
175
|
@property
|
|
127
176
|
def messages_list(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.Message]: ...
|
|
128
177
|
@property
|
|
129
178
|
def message_object_trees(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[flwr.proto.message_pb2.ObjectTree]: ...
|
|
130
|
-
def __init__(
|
|
179
|
+
def __init__(
|
|
180
|
+
self,
|
|
131
181
|
*,
|
|
132
|
-
messages_list:
|
|
133
|
-
message_object_trees:
|
|
134
|
-
|
|
135
|
-
def ClearField(self, field_name:
|
|
182
|
+
messages_list: collections.abc.Iterable[flwr.proto.message_pb2.Message] | None = ...,
|
|
183
|
+
message_object_trees: collections.abc.Iterable[flwr.proto.message_pb2.ObjectTree] | None = ...,
|
|
184
|
+
) -> None: ...
|
|
185
|
+
def ClearField(self, field_name: typing.Literal["message_object_trees", b"message_object_trees", "messages_list", b"messages_list"]) -> None: ...
|
|
186
|
+
|
|
136
187
|
global___PullAppMessagesResponse = PullAppMessagesResponse
|
|
137
188
|
|
|
189
|
+
@typing.final
|
|
138
190
|
class PullAppInputsRequest(google.protobuf.message.Message):
|
|
139
191
|
"""PullAppInputs messages"""
|
|
192
|
+
|
|
140
193
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
194
|
+
|
|
141
195
|
TOKEN_FIELD_NUMBER: builtins.int
|
|
142
|
-
token:
|
|
143
|
-
def __init__(
|
|
196
|
+
token: builtins.str
|
|
197
|
+
def __init__(
|
|
198
|
+
self,
|
|
144
199
|
*,
|
|
145
|
-
token:
|
|
146
|
-
|
|
147
|
-
def ClearField(self, field_name:
|
|
200
|
+
token: builtins.str = ...,
|
|
201
|
+
) -> None: ...
|
|
202
|
+
def ClearField(self, field_name: typing.Literal["token", b"token"]) -> None: ...
|
|
203
|
+
|
|
148
204
|
global___PullAppInputsRequest = PullAppInputsRequest
|
|
149
205
|
|
|
206
|
+
@typing.final
|
|
150
207
|
class PullAppInputsResponse(google.protobuf.message.Message):
|
|
151
208
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
209
|
+
|
|
152
210
|
CONTEXT_FIELD_NUMBER: builtins.int
|
|
153
211
|
RUN_FIELD_NUMBER: builtins.int
|
|
154
212
|
FAB_FIELD_NUMBER: builtins.int
|
|
@@ -158,38 +216,49 @@ class PullAppInputsResponse(google.protobuf.message.Message):
|
|
|
158
216
|
def run(self) -> flwr.proto.run_pb2.Run: ...
|
|
159
217
|
@property
|
|
160
218
|
def fab(self) -> flwr.proto.fab_pb2.Fab: ...
|
|
161
|
-
def __init__(
|
|
219
|
+
def __init__(
|
|
220
|
+
self,
|
|
162
221
|
*,
|
|
163
|
-
context:
|
|
164
|
-
run:
|
|
165
|
-
fab:
|
|
166
|
-
|
|
167
|
-
def HasField(self, field_name:
|
|
168
|
-
def ClearField(self, field_name:
|
|
222
|
+
context: flwr.proto.message_pb2.Context | None = ...,
|
|
223
|
+
run: flwr.proto.run_pb2.Run | None = ...,
|
|
224
|
+
fab: flwr.proto.fab_pb2.Fab | None = ...,
|
|
225
|
+
) -> None: ...
|
|
226
|
+
def HasField(self, field_name: typing.Literal["context", b"context", "fab", b"fab", "run", b"run"]) -> builtins.bool: ...
|
|
227
|
+
def ClearField(self, field_name: typing.Literal["context", b"context", "fab", b"fab", "run", b"run"]) -> None: ...
|
|
228
|
+
|
|
169
229
|
global___PullAppInputsResponse = PullAppInputsResponse
|
|
170
230
|
|
|
231
|
+
@typing.final
|
|
171
232
|
class PushAppOutputsRequest(google.protobuf.message.Message):
|
|
172
233
|
"""PushAppInputs messages"""
|
|
234
|
+
|
|
173
235
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
236
|
+
|
|
174
237
|
TOKEN_FIELD_NUMBER: builtins.int
|
|
175
238
|
RUN_ID_FIELD_NUMBER: builtins.int
|
|
176
239
|
CONTEXT_FIELD_NUMBER: builtins.int
|
|
177
|
-
token:
|
|
240
|
+
token: builtins.str
|
|
178
241
|
run_id: builtins.int
|
|
179
242
|
@property
|
|
180
243
|
def context(self) -> flwr.proto.message_pb2.Context: ...
|
|
181
|
-
def __init__(
|
|
244
|
+
def __init__(
|
|
245
|
+
self,
|
|
182
246
|
*,
|
|
183
|
-
token:
|
|
247
|
+
token: builtins.str = ...,
|
|
184
248
|
run_id: builtins.int = ...,
|
|
185
|
-
context:
|
|
186
|
-
|
|
187
|
-
def HasField(self, field_name:
|
|
188
|
-
def ClearField(self, field_name:
|
|
249
|
+
context: flwr.proto.message_pb2.Context | None = ...,
|
|
250
|
+
) -> None: ...
|
|
251
|
+
def HasField(self, field_name: typing.Literal["context", b"context"]) -> builtins.bool: ...
|
|
252
|
+
def ClearField(self, field_name: typing.Literal["context", b"context", "run_id", b"run_id", "token", b"token"]) -> None: ...
|
|
253
|
+
|
|
189
254
|
global___PushAppOutputsRequest = PushAppOutputsRequest
|
|
190
255
|
|
|
256
|
+
@typing.final
|
|
191
257
|
class PushAppOutputsResponse(google.protobuf.message.Message):
|
|
192
258
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
193
|
-
|
|
194
|
-
|
|
259
|
+
|
|
260
|
+
def __init__(
|
|
261
|
+
self,
|
|
262
|
+
) -> None: ...
|
|
263
|
+
|
|
195
264
|
global___PushAppOutputsResponse = PushAppOutputsResponse
|
flwr/proto/appio_pb2_grpc.py
CHANGED
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
|
|
2
2
|
"""Client and server classes corresponding to protobuf-defined services."""
|
|
3
3
|
import grpc
|
|
4
|
+
import warnings
|
|
4
5
|
|
|
6
|
+
|
|
7
|
+
GRPC_GENERATED_VERSION = '1.70.0'
|
|
8
|
+
GRPC_VERSION = grpc.__version__
|
|
9
|
+
_version_not_supported = False
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
from grpc._utilities import first_version_is_lower
|
|
13
|
+
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
|
|
14
|
+
except ImportError:
|
|
15
|
+
_version_not_supported = True
|
|
16
|
+
|
|
17
|
+
if _version_not_supported:
|
|
18
|
+
raise RuntimeError(
|
|
19
|
+
f'The grpc package installed is at version {GRPC_VERSION},'
|
|
20
|
+
+ f' but the generated code in flwr/proto/appio_pb2_grpc.py depends on'
|
|
21
|
+
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
|
|
22
|
+
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
|
|
23
|
+
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
|
|
24
|
+
)
|
flwr/proto/appio_pb2_grpc.pyi
CHANGED
|
@@ -1,4 +1,31 @@
|
|
|
1
1
|
"""
|
|
2
2
|
@generated by mypy-protobuf. Do not edit manually!
|
|
3
3
|
isort:skip_file
|
|
4
|
+
Copyright 2025 Flower Labs GmbH. All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
you may not use this file except in compliance with the License.
|
|
8
|
+
You may obtain a copy of the License at
|
|
9
|
+
|
|
10
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
|
|
12
|
+
Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
See the License for the specific language governing permissions and
|
|
16
|
+
limitations under the License.
|
|
17
|
+
==============================================================================
|
|
4
18
|
"""
|
|
19
|
+
|
|
20
|
+
import abc
|
|
21
|
+
import collections.abc
|
|
22
|
+
import grpc
|
|
23
|
+
import grpc.aio
|
|
24
|
+
import typing
|
|
25
|
+
|
|
26
|
+
_T = typing.TypeVar("_T")
|
|
27
|
+
|
|
28
|
+
class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ...
|
|
29
|
+
|
|
30
|
+
class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext): # type: ignore[misc, type-arg]
|
|
31
|
+
...
|