flwr-nightly 1.19.0.dev20250501__py3-none-any.whl → 1.19.0.dev20250507__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/client/grpc_rere_client/connection.py +13 -7
- flwr/client/grpc_rere_client/grpc_adapter.py +8 -6
- flwr/client/rest_client/connection.py +13 -7
- flwr/proto/fleet_pb2.py +24 -27
- flwr/proto/fleet_pb2.pyi +0 -28
- flwr/proto/fleet_pb2_grpc.py +14 -13
- flwr/proto/fleet_pb2_grpc.pyi +7 -6
- flwr/proto/heartbeat_pb2.py +29 -0
- flwr/proto/heartbeat_pb2.pyi +40 -0
- flwr/proto/heartbeat_pb2_grpc.py +4 -0
- flwr/proto/heartbeat_pb2_grpc.pyi +4 -0
- flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +5 -3
- flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +9 -7
- flwr/server/superlink/fleet/message_handler/message_handler.py +11 -7
- flwr/server/superlink/fleet/rest_rere/rest_api.py +11 -7
- flwr/server/superlink/linkstate/in_memory_linkstate.py +3 -1
- flwr/server/superlink/linkstate/linkstate.py +3 -1
- flwr/server/superlink/linkstate/sqlite_linkstate.py +3 -1
- {flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/METADATA +4 -4
- {flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/RECORD +22 -18
- {flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/WHEEL +1 -1
- {flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/entry_points.txt +0 -0
@@ -42,13 +42,15 @@ from flwr.proto.fab_pb2 import GetFabRequest, GetFabResponse # pylint: disable=
|
|
42
42
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
43
43
|
CreateNodeRequest,
|
44
44
|
DeleteNodeRequest,
|
45
|
-
HeartbeatRequest,
|
46
|
-
HeartbeatResponse,
|
47
45
|
PullMessagesRequest,
|
48
46
|
PullMessagesResponse,
|
49
47
|
PushMessagesRequest,
|
50
48
|
)
|
51
49
|
from flwr.proto.fleet_pb2_grpc import FleetStub # pylint: disable=E0611
|
50
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
51
|
+
SendNodeHeartbeatRequest,
|
52
|
+
SendNodeHeartbeatResponse,
|
53
|
+
)
|
52
54
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
53
55
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
54
56
|
|
@@ -157,21 +159,25 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
157
159
|
retry_invoker.should_giveup = _should_giveup_fn
|
158
160
|
|
159
161
|
###########################################################################
|
160
|
-
#
|
162
|
+
# send_node_heartbeat/create_node/delete_node/receive/send/get_run functions
|
161
163
|
###########################################################################
|
162
164
|
|
163
|
-
def
|
165
|
+
def send_node_heartbeat() -> bool:
|
164
166
|
# Get Node
|
165
167
|
if node is None:
|
166
168
|
log(ERROR, "Node instance missing")
|
167
169
|
return False
|
168
170
|
|
169
171
|
# Construct the heartbeat request
|
170
|
-
req =
|
172
|
+
req = SendNodeHeartbeatRequest(
|
173
|
+
node=node, heartbeat_interval=HEARTBEAT_DEFAULT_INTERVAL
|
174
|
+
)
|
171
175
|
|
172
176
|
# Call FleetAPI
|
173
177
|
try:
|
174
|
-
res:
|
178
|
+
res: SendNodeHeartbeatResponse = stub.SendNodeHeartbeat(
|
179
|
+
req, timeout=HEARTBEAT_CALL_TIMEOUT
|
180
|
+
)
|
175
181
|
except grpc.RpcError as e:
|
176
182
|
status_code = e.code()
|
177
183
|
if status_code == grpc.StatusCode.UNAVAILABLE:
|
@@ -188,7 +194,7 @@ def grpc_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
188
194
|
)
|
189
195
|
return True
|
190
196
|
|
191
|
-
heartbeat_sender = HeartbeatSender(
|
197
|
+
heartbeat_sender = HeartbeatSender(send_node_heartbeat)
|
192
198
|
|
193
199
|
def create_node() -> Optional[int]:
|
194
200
|
"""Set create_node."""
|
@@ -38,8 +38,6 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
38
38
|
CreateNodeResponse,
|
39
39
|
DeleteNodeRequest,
|
40
40
|
DeleteNodeResponse,
|
41
|
-
HeartbeatRequest,
|
42
|
-
HeartbeatResponse,
|
43
41
|
PullMessagesRequest,
|
44
42
|
PullMessagesResponse,
|
45
43
|
PushMessagesRequest,
|
@@ -47,6 +45,10 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
47
45
|
)
|
48
46
|
from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
|
49
47
|
from flwr.proto.grpcadapter_pb2_grpc import GrpcAdapterStub
|
48
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
49
|
+
SendNodeHeartbeatRequest,
|
50
|
+
SendNodeHeartbeatResponse,
|
51
|
+
)
|
50
52
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
51
53
|
|
52
54
|
T = TypeVar("T", bound=GrpcMessage)
|
@@ -120,11 +122,11 @@ class GrpcAdapter:
|
|
120
122
|
"""."""
|
121
123
|
return self._send_and_receive(request, DeleteNodeResponse, **kwargs)
|
122
124
|
|
123
|
-
def
|
124
|
-
self, request:
|
125
|
-
) ->
|
125
|
+
def SendNodeHeartbeat( # pylint: disable=C0103
|
126
|
+
self, request: SendNodeHeartbeatRequest, **kwargs: Any
|
127
|
+
) -> SendNodeHeartbeatResponse:
|
126
128
|
"""."""
|
127
|
-
return self._send_and_receive(request,
|
129
|
+
return self._send_and_receive(request, SendNodeHeartbeatResponse, **kwargs)
|
128
130
|
|
129
131
|
def PullMessages( # pylint: disable=C0103
|
130
132
|
self, request: PullMessagesRequest, **kwargs: Any
|
@@ -41,13 +41,15 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
41
41
|
CreateNodeResponse,
|
42
42
|
DeleteNodeRequest,
|
43
43
|
DeleteNodeResponse,
|
44
|
-
HeartbeatRequest,
|
45
|
-
HeartbeatResponse,
|
46
44
|
PullMessagesRequest,
|
47
45
|
PullMessagesResponse,
|
48
46
|
PushMessagesRequest,
|
49
47
|
PushMessagesResponse,
|
50
48
|
)
|
49
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
50
|
+
SendNodeHeartbeatRequest,
|
51
|
+
SendNodeHeartbeatResponse,
|
52
|
+
)
|
51
53
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
52
54
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
53
55
|
|
@@ -61,7 +63,7 @@ PATH_CREATE_NODE: str = "api/v0/fleet/create-node"
|
|
61
63
|
PATH_DELETE_NODE: str = "api/v0/fleet/delete-node"
|
62
64
|
PATH_PULL_MESSAGES: str = "/api/v0/fleet/pull-messages"
|
63
65
|
PATH_PUSH_MESSAGES: str = "/api/v0/fleet/push-messages"
|
64
|
-
|
66
|
+
PATH_SEND_NODE_HEARTBEAT: str = "api/v0/fleet/send-node-heartbeat"
|
65
67
|
PATH_GET_RUN: str = "/api/v0/fleet/get-run"
|
66
68
|
PATH_GET_FAB: str = "/api/v0/fleet/get-fab"
|
67
69
|
|
@@ -205,17 +207,21 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
205
207
|
grpc_res.ParseFromString(res.content)
|
206
208
|
return grpc_res
|
207
209
|
|
208
|
-
def
|
210
|
+
def send_node_heartbeat() -> bool:
|
209
211
|
# Get Node
|
210
212
|
if node is None:
|
211
213
|
log(ERROR, "Node instance missing")
|
212
214
|
return False
|
213
215
|
|
214
216
|
# Construct the heartbeat request
|
215
|
-
req =
|
217
|
+
req = SendNodeHeartbeatRequest(
|
218
|
+
node=node, heartbeat_interval=HEARTBEAT_DEFAULT_INTERVAL
|
219
|
+
)
|
216
220
|
|
217
221
|
# Send the request
|
218
|
-
res = _request(
|
222
|
+
res = _request(
|
223
|
+
req, SendNodeHeartbeatResponse, PATH_SEND_NODE_HEARTBEAT, retry=False
|
224
|
+
)
|
219
225
|
if res is None:
|
220
226
|
return False
|
221
227
|
|
@@ -227,7 +233,7 @@ def http_request_response( # pylint: disable=R0913,R0914,R0915,R0917
|
|
227
233
|
)
|
228
234
|
return True
|
229
235
|
|
230
|
-
heartbeat_sender = HeartbeatSender(
|
236
|
+
heartbeat_sender = HeartbeatSender(send_node_heartbeat)
|
231
237
|
|
232
238
|
def create_node() -> Optional[int]:
|
233
239
|
"""Set create_node."""
|
flwr/proto/fleet_pb2.py
CHANGED
@@ -12,13 +12,14 @@ 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\"/\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\"
|
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\"l\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\"a\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\"\xb0\x01\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\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\r:\x02\x38\x01\"\x1e\n\tReconnect\x12\x11\n\treconnect\x18\x01 \x01(\x04\x32\xb9\x04\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\x62\x06proto3')
|
22
23
|
|
23
24
|
_globals = globals()
|
24
25
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -27,30 +28,26 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
27
28
|
DESCRIPTOR._options = None
|
28
29
|
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._options = None
|
29
30
|
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
|
30
|
-
_globals['_CREATENODEREQUEST']._serialized_start=
|
31
|
-
_globals['_CREATENODEREQUEST']._serialized_end=
|
32
|
-
_globals['_CREATENODERESPONSE']._serialized_start=
|
33
|
-
_globals['_CREATENODERESPONSE']._serialized_end=
|
34
|
-
_globals['_DELETENODEREQUEST']._serialized_start=
|
35
|
-
_globals['_DELETENODEREQUEST']._serialized_end=
|
36
|
-
_globals['_DELETENODERESPONSE']._serialized_start=
|
37
|
-
_globals['_DELETENODERESPONSE']._serialized_end=
|
38
|
-
_globals['
|
39
|
-
_globals['
|
40
|
-
_globals['
|
41
|
-
_globals['
|
42
|
-
_globals['
|
43
|
-
_globals['
|
44
|
-
_globals['
|
45
|
-
_globals['
|
46
|
-
_globals['
|
47
|
-
_globals['
|
48
|
-
_globals['
|
49
|
-
_globals['
|
50
|
-
_globals['
|
51
|
-
_globals['
|
52
|
-
_globals['_RECONNECT']._serialized_start=891
|
53
|
-
_globals['_RECONNECT']._serialized_end=921
|
54
|
-
_globals['_FLEET']._serialized_start=924
|
55
|
-
_globals['_FLEET']._serialized_end=1469
|
31
|
+
_globals['_CREATENODEREQUEST']._serialized_start=159
|
32
|
+
_globals['_CREATENODEREQUEST']._serialized_end=206
|
33
|
+
_globals['_CREATENODERESPONSE']._serialized_start=208
|
34
|
+
_globals['_CREATENODERESPONSE']._serialized_end=260
|
35
|
+
_globals['_DELETENODEREQUEST']._serialized_start=262
|
36
|
+
_globals['_DELETENODEREQUEST']._serialized_end=313
|
37
|
+
_globals['_DELETENODERESPONSE']._serialized_start=315
|
38
|
+
_globals['_DELETENODERESPONSE']._serialized_end=335
|
39
|
+
_globals['_PULLMESSAGESREQUEST']._serialized_start=337
|
40
|
+
_globals['_PULLMESSAGESREQUEST']._serialized_end=411
|
41
|
+
_globals['_PULLMESSAGESRESPONSE']._serialized_start=413
|
42
|
+
_globals['_PULLMESSAGESRESPONSE']._serialized_end=521
|
43
|
+
_globals['_PUSHMESSAGESREQUEST']._serialized_start=523
|
44
|
+
_globals['_PUSHMESSAGESREQUEST']._serialized_end=620
|
45
|
+
_globals['_PUSHMESSAGESRESPONSE']._serialized_start=623
|
46
|
+
_globals['_PUSHMESSAGESRESPONSE']._serialized_end=799
|
47
|
+
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_start=753
|
48
|
+
_globals['_PUSHMESSAGESRESPONSE_RESULTSENTRY']._serialized_end=799
|
49
|
+
_globals['_RECONNECT']._serialized_start=801
|
50
|
+
_globals['_RECONNECT']._serialized_end=831
|
51
|
+
_globals['_FLEET']._serialized_start=834
|
52
|
+
_globals['_FLEET']._serialized_end=1403
|
56
53
|
# @@protoc_insertion_point(module_scope)
|
flwr/proto/fleet_pb2.pyi
CHANGED
@@ -58,34 +58,6 @@ class DeleteNodeResponse(google.protobuf.message.Message):
|
|
58
58
|
) -> None: ...
|
59
59
|
global___DeleteNodeResponse = DeleteNodeResponse
|
60
60
|
|
61
|
-
class HeartbeatRequest(google.protobuf.message.Message):
|
62
|
-
"""Heartbeat messages"""
|
63
|
-
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
64
|
-
NODE_FIELD_NUMBER: builtins.int
|
65
|
-
HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
|
66
|
-
@property
|
67
|
-
def node(self) -> flwr.proto.node_pb2.Node: ...
|
68
|
-
heartbeat_interval: builtins.float
|
69
|
-
def __init__(self,
|
70
|
-
*,
|
71
|
-
node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
|
72
|
-
heartbeat_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["heartbeat_interval",b"heartbeat_interval","node",b"node"]) -> None: ...
|
76
|
-
global___HeartbeatRequest = HeartbeatRequest
|
77
|
-
|
78
|
-
class HeartbeatResponse(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___HeartbeatResponse = HeartbeatResponse
|
88
|
-
|
89
61
|
class PullMessagesRequest(google.protobuf.message.Message):
|
90
62
|
"""PullMessages messages"""
|
91
63
|
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
flwr/proto/fleet_pb2_grpc.py
CHANGED
@@ -4,6 +4,7 @@ import grpc
|
|
4
4
|
|
5
5
|
from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
|
6
6
|
from flwr.proto import fleet_pb2 as flwr_dot_proto_dot_fleet__pb2
|
7
|
+
from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
|
7
8
|
from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
|
8
9
|
|
9
10
|
|
@@ -26,10 +27,10 @@ class FleetStub(object):
|
|
26
27
|
request_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.SerializeToString,
|
27
28
|
response_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.FromString,
|
28
29
|
)
|
29
|
-
self.
|
30
|
-
'/flwr.proto.Fleet/
|
31
|
-
request_serializer=
|
32
|
-
response_deserializer=
|
30
|
+
self.SendNodeHeartbeat = channel.unary_unary(
|
31
|
+
'/flwr.proto.Fleet/SendNodeHeartbeat',
|
32
|
+
request_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatRequest.SerializeToString,
|
33
|
+
response_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatResponse.FromString,
|
33
34
|
)
|
34
35
|
self.PullMessages = channel.unary_unary(
|
35
36
|
'/flwr.proto.Fleet/PullMessages',
|
@@ -68,7 +69,7 @@ class FleetServicer(object):
|
|
68
69
|
context.set_details('Method not implemented!')
|
69
70
|
raise NotImplementedError('Method not implemented!')
|
70
71
|
|
71
|
-
def
|
72
|
+
def SendNodeHeartbeat(self, request, context):
|
72
73
|
"""Missing associated documentation comment in .proto file."""
|
73
74
|
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
|
74
75
|
context.set_details('Method not implemented!')
|
@@ -118,10 +119,10 @@ def add_FleetServicer_to_server(servicer, server):
|
|
118
119
|
request_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.FromString,
|
119
120
|
response_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.SerializeToString,
|
120
121
|
),
|
121
|
-
'
|
122
|
-
servicer.
|
123
|
-
request_deserializer=
|
124
|
-
response_serializer=
|
122
|
+
'SendNodeHeartbeat': grpc.unary_unary_rpc_method_handler(
|
123
|
+
servicer.SendNodeHeartbeat,
|
124
|
+
request_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatRequest.FromString,
|
125
|
+
response_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatResponse.SerializeToString,
|
125
126
|
),
|
126
127
|
'PullMessages': grpc.unary_unary_rpc_method_handler(
|
127
128
|
servicer.PullMessages,
|
@@ -188,7 +189,7 @@ class Fleet(object):
|
|
188
189
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
189
190
|
|
190
191
|
@staticmethod
|
191
|
-
def
|
192
|
+
def SendNodeHeartbeat(request,
|
192
193
|
target,
|
193
194
|
options=(),
|
194
195
|
channel_credentials=None,
|
@@ -198,9 +199,9 @@ class Fleet(object):
|
|
198
199
|
wait_for_ready=None,
|
199
200
|
timeout=None,
|
200
201
|
metadata=None):
|
201
|
-
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/
|
202
|
-
|
203
|
-
|
202
|
+
return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/SendNodeHeartbeat',
|
203
|
+
flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatRequest.SerializeToString,
|
204
|
+
flwr_dot_proto_dot_heartbeat__pb2.SendNodeHeartbeatResponse.FromString,
|
204
205
|
options, channel_credentials,
|
205
206
|
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
|
206
207
|
|
flwr/proto/fleet_pb2_grpc.pyi
CHANGED
@@ -5,6 +5,7 @@ isort:skip_file
|
|
5
5
|
import abc
|
6
6
|
import flwr.proto.fab_pb2
|
7
7
|
import flwr.proto.fleet_pb2
|
8
|
+
import flwr.proto.heartbeat_pb2
|
8
9
|
import flwr.proto.run_pb2
|
9
10
|
import grpc
|
10
11
|
|
@@ -18,9 +19,9 @@ class FleetStub:
|
|
18
19
|
flwr.proto.fleet_pb2.DeleteNodeRequest,
|
19
20
|
flwr.proto.fleet_pb2.DeleteNodeResponse]
|
20
21
|
|
21
|
-
|
22
|
-
flwr.proto.
|
23
|
-
flwr.proto.
|
22
|
+
SendNodeHeartbeat: grpc.UnaryUnaryMultiCallable[
|
23
|
+
flwr.proto.heartbeat_pb2.SendNodeHeartbeatRequest,
|
24
|
+
flwr.proto.heartbeat_pb2.SendNodeHeartbeatResponse]
|
24
25
|
|
25
26
|
PullMessages: grpc.UnaryUnaryMultiCallable[
|
26
27
|
flwr.proto.fleet_pb2.PullMessagesRequest,
|
@@ -62,10 +63,10 @@ class FleetServicer(metaclass=abc.ABCMeta):
|
|
62
63
|
) -> flwr.proto.fleet_pb2.DeleteNodeResponse: ...
|
63
64
|
|
64
65
|
@abc.abstractmethod
|
65
|
-
def
|
66
|
-
request: flwr.proto.
|
66
|
+
def SendNodeHeartbeat(self,
|
67
|
+
request: flwr.proto.heartbeat_pb2.SendNodeHeartbeatRequest,
|
67
68
|
context: grpc.ServicerContext,
|
68
|
-
) -> flwr.proto.
|
69
|
+
) -> flwr.proto.heartbeat_pb2.SendNodeHeartbeatResponse: ...
|
69
70
|
|
70
71
|
@abc.abstractmethod
|
71
72
|
def PullMessages(self,
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# source: flwr/proto/heartbeat.proto
|
4
|
+
# Protobuf Python Version: 4.25.1
|
5
|
+
"""Generated protocol buffer code."""
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
9
|
+
from google.protobuf.internal import builder as _builder
|
10
|
+
# @@protoc_insertion_point(imports)
|
11
|
+
|
12
|
+
_sym_db = _symbol_database.Default()
|
13
|
+
|
14
|
+
|
15
|
+
from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
|
16
|
+
|
17
|
+
|
18
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1a\x66lwr/proto/heartbeat.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"V\n\x18SendNodeHeartbeatRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x1a\n\x12heartbeat_interval\x18\x02 \x01(\x01\",\n\x19SendNodeHeartbeatResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x62\x06proto3')
|
19
|
+
|
20
|
+
_globals = globals()
|
21
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
22
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.heartbeat_pb2', _globals)
|
23
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
24
|
+
DESCRIPTOR._options = None
|
25
|
+
_globals['_SENDNODEHEARTBEATREQUEST']._serialized_start=65
|
26
|
+
_globals['_SENDNODEHEARTBEATREQUEST']._serialized_end=151
|
27
|
+
_globals['_SENDNODEHEARTBEATRESPONSE']._serialized_start=153
|
28
|
+
_globals['_SENDNODEHEARTBEATRESPONSE']._serialized_end=197
|
29
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
3
|
+
isort:skip_file
|
4
|
+
"""
|
5
|
+
import builtins
|
6
|
+
import flwr.proto.node_pb2
|
7
|
+
import google.protobuf.descriptor
|
8
|
+
import google.protobuf.message
|
9
|
+
import typing
|
10
|
+
import typing_extensions
|
11
|
+
|
12
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
13
|
+
|
14
|
+
class SendNodeHeartbeatRequest(google.protobuf.message.Message):
|
15
|
+
"""Node Heartbeat messages"""
|
16
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
17
|
+
NODE_FIELD_NUMBER: builtins.int
|
18
|
+
HEARTBEAT_INTERVAL_FIELD_NUMBER: builtins.int
|
19
|
+
@property
|
20
|
+
def node(self) -> flwr.proto.node_pb2.Node: ...
|
21
|
+
heartbeat_interval: builtins.float
|
22
|
+
def __init__(self,
|
23
|
+
*,
|
24
|
+
node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
|
25
|
+
heartbeat_interval: builtins.float = ...,
|
26
|
+
) -> None: ...
|
27
|
+
def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
|
28
|
+
def ClearField(self, field_name: typing_extensions.Literal["heartbeat_interval",b"heartbeat_interval","node",b"node"]) -> None: ...
|
29
|
+
global___SendNodeHeartbeatRequest = SendNodeHeartbeatRequest
|
30
|
+
|
31
|
+
class SendNodeHeartbeatResponse(google.protobuf.message.Message):
|
32
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
33
|
+
SUCCESS_FIELD_NUMBER: builtins.int
|
34
|
+
success: builtins.bool
|
35
|
+
def __init__(self,
|
36
|
+
*,
|
37
|
+
success: builtins.bool = ...,
|
38
|
+
) -> None: ...
|
39
|
+
def ClearField(self, field_name: typing_extensions.Literal["success",b"success"]) -> None: ...
|
40
|
+
global___SendNodeHeartbeatResponse = SendNodeHeartbeatResponse
|
@@ -35,11 +35,11 @@ from flwr.proto.fab_pb2 import GetFabRequest # pylint: disable=E0611
|
|
35
35
|
from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
36
36
|
CreateNodeRequest,
|
37
37
|
DeleteNodeRequest,
|
38
|
-
HeartbeatRequest,
|
39
38
|
PullMessagesRequest,
|
40
39
|
PushMessagesRequest,
|
41
40
|
)
|
42
41
|
from flwr.proto.grpcadapter_pb2 import MessageContainer # pylint: disable=E0611
|
42
|
+
from flwr.proto.heartbeat_pb2 import SendNodeHeartbeatRequest # pylint: disable=E0611
|
43
43
|
from flwr.proto.run_pb2 import GetRunRequest # pylint: disable=E0611
|
44
44
|
|
45
45
|
from ..grpc_rere.fleet_servicer import FleetServicer
|
@@ -81,8 +81,10 @@ class GrpcAdapterServicer(grpcadapter_pb2_grpc.GrpcAdapterServicer, FleetService
|
|
81
81
|
return _handle(request, context, CreateNodeRequest, self.CreateNode)
|
82
82
|
if request.grpc_message_name == DeleteNodeRequest.__qualname__:
|
83
83
|
return _handle(request, context, DeleteNodeRequest, self.DeleteNode)
|
84
|
-
if request.grpc_message_name ==
|
85
|
-
return _handle(
|
84
|
+
if request.grpc_message_name == SendNodeHeartbeatRequest.__qualname__:
|
85
|
+
return _handle(
|
86
|
+
request, context, SendNodeHeartbeatRequest, self.SendNodeHeartbeat
|
87
|
+
)
|
86
88
|
if request.grpc_message_name == GetRunRequest.__qualname__:
|
87
89
|
return _handle(request, context, GetRunRequest, self.GetRun)
|
88
90
|
if request.grpc_message_name == GetFabRequest.__qualname__:
|
@@ -29,13 +29,15 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
29
29
|
CreateNodeResponse,
|
30
30
|
DeleteNodeRequest,
|
31
31
|
DeleteNodeResponse,
|
32
|
-
HeartbeatRequest,
|
33
|
-
HeartbeatResponse,
|
34
32
|
PullMessagesRequest,
|
35
33
|
PullMessagesResponse,
|
36
34
|
PushMessagesRequest,
|
37
35
|
PushMessagesResponse,
|
38
36
|
)
|
37
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
38
|
+
SendNodeHeartbeatRequest,
|
39
|
+
SendNodeHeartbeatResponse,
|
40
|
+
)
|
39
41
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
40
42
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
41
43
|
from flwr.server.superlink.fleet.message_handler import message_handler
|
@@ -81,12 +83,12 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
|
|
81
83
|
state=self.state_factory.state(),
|
82
84
|
)
|
83
85
|
|
84
|
-
def
|
85
|
-
self, request:
|
86
|
-
) ->
|
86
|
+
def SendNodeHeartbeat(
|
87
|
+
self, request: SendNodeHeartbeatRequest, context: grpc.ServicerContext
|
88
|
+
) -> SendNodeHeartbeatResponse:
|
87
89
|
"""."""
|
88
|
-
log(DEBUG, "[Fleet.
|
89
|
-
return message_handler.
|
90
|
+
log(DEBUG, "[Fleet.SendNodeHeartbeat] Request: %s", MessageToDict(request))
|
91
|
+
return message_handler.send_node_heartbeat(
|
90
92
|
request=request,
|
91
93
|
state=self.state_factory.state(),
|
92
94
|
)
|
@@ -33,14 +33,16 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
33
33
|
CreateNodeResponse,
|
34
34
|
DeleteNodeRequest,
|
35
35
|
DeleteNodeResponse,
|
36
|
-
HeartbeatRequest,
|
37
|
-
HeartbeatResponse,
|
38
36
|
PullMessagesRequest,
|
39
37
|
PullMessagesResponse,
|
40
38
|
PushMessagesRequest,
|
41
39
|
PushMessagesResponse,
|
42
40
|
Reconnect,
|
43
41
|
)
|
42
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
43
|
+
SendNodeHeartbeatRequest,
|
44
|
+
SendNodeHeartbeatResponse,
|
45
|
+
)
|
44
46
|
from flwr.proto.node_pb2 import Node # pylint: disable=E0611
|
45
47
|
from flwr.proto.run_pb2 import ( # pylint: disable=E0611
|
46
48
|
GetRunRequest,
|
@@ -73,13 +75,15 @@ def delete_node(request: DeleteNodeRequest, state: LinkState) -> DeleteNodeRespo
|
|
73
75
|
return DeleteNodeResponse()
|
74
76
|
|
75
77
|
|
76
|
-
def
|
77
|
-
request:
|
78
|
+
def send_node_heartbeat(
|
79
|
+
request: SendNodeHeartbeatRequest, # pylint: disable=unused-argument
|
78
80
|
state: LinkState, # pylint: disable=unused-argument
|
79
|
-
) ->
|
81
|
+
) -> SendNodeHeartbeatResponse:
|
80
82
|
"""."""
|
81
|
-
res = state.
|
82
|
-
|
83
|
+
res = state.acknowledge_node_heartbeat(
|
84
|
+
request.node.node_id, request.heartbeat_interval
|
85
|
+
)
|
86
|
+
return SendNodeHeartbeatResponse(success=res)
|
83
87
|
|
84
88
|
|
85
89
|
def pull_messages(
|
@@ -29,13 +29,15 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
|
|
29
29
|
CreateNodeResponse,
|
30
30
|
DeleteNodeRequest,
|
31
31
|
DeleteNodeResponse,
|
32
|
-
HeartbeatRequest,
|
33
|
-
HeartbeatResponse,
|
34
32
|
PullMessagesRequest,
|
35
33
|
PullMessagesResponse,
|
36
34
|
PushMessagesRequest,
|
37
35
|
PushMessagesResponse,
|
38
36
|
)
|
37
|
+
from flwr.proto.heartbeat_pb2 import ( # pylint: disable=E0611
|
38
|
+
SendNodeHeartbeatRequest,
|
39
|
+
SendNodeHeartbeatResponse,
|
40
|
+
)
|
39
41
|
from flwr.proto.run_pb2 import GetRunRequest, GetRunResponse # pylint: disable=E0611
|
40
42
|
from flwr.server.superlink.ffs.ffs import Ffs
|
41
43
|
from flwr.server.superlink.ffs.ffs_factory import FfsFactory
|
@@ -126,14 +128,16 @@ async def push_message(request: PushMessagesRequest) -> PushMessagesResponse:
|
|
126
128
|
return message_handler.push_messages(request=request, state=state)
|
127
129
|
|
128
130
|
|
129
|
-
@rest_request_response(
|
130
|
-
async def
|
131
|
-
|
131
|
+
@rest_request_response(SendNodeHeartbeatRequest)
|
132
|
+
async def send_node_heartbeat(
|
133
|
+
request: SendNodeHeartbeatRequest,
|
134
|
+
) -> SendNodeHeartbeatResponse:
|
135
|
+
"""Send node heartbeat."""
|
132
136
|
# Get state from app
|
133
137
|
state: LinkState = cast(LinkStateFactory, app.state.STATE_FACTORY).state()
|
134
138
|
|
135
139
|
# Handle message
|
136
|
-
return message_handler.
|
140
|
+
return message_handler.send_node_heartbeat(request=request, state=state)
|
137
141
|
|
138
142
|
|
139
143
|
@rest_request_response(GetRunRequest)
|
@@ -164,7 +168,7 @@ routes = [
|
|
164
168
|
Route("/api/v0/fleet/delete-node", delete_node, methods=["POST"]),
|
165
169
|
Route("/api/v0/fleet/pull-messages", pull_message, methods=["POST"]),
|
166
170
|
Route("/api/v0/fleet/push-messages", push_message, methods=["POST"]),
|
167
|
-
Route("/api/v0/fleet/heartbeat",
|
171
|
+
Route("/api/v0/fleet/send-node-heartbeat", send_node_heartbeat, methods=["POST"]),
|
168
172
|
Route("/api/v0/fleet/get-run", get_run, methods=["POST"]),
|
169
173
|
Route("/api/v0/fleet/get-fab", get_fab, methods=["POST"]),
|
170
174
|
]
|
@@ -539,7 +539,9 @@ class InMemoryLinkState(LinkState): # pylint: disable=R0902,R0904
|
|
539
539
|
return None
|
540
540
|
return self.federation_options[run_id]
|
541
541
|
|
542
|
-
def
|
542
|
+
def acknowledge_node_heartbeat(
|
543
|
+
self, node_id: int, heartbeat_interval: float
|
544
|
+
) -> bool:
|
543
545
|
"""Acknowledge a heartbeat received from a node, serving as a heartbeat.
|
544
546
|
|
545
547
|
A node is considered online as long as it sends heartbeats within
|
@@ -267,7 +267,9 @@ class LinkState(abc.ABC): # pylint: disable=R0904
|
|
267
267
|
"""Retrieve all currently stored `node_public_keys` as a set."""
|
268
268
|
|
269
269
|
@abc.abstractmethod
|
270
|
-
def
|
270
|
+
def acknowledge_node_heartbeat(
|
271
|
+
self, node_id: int, heartbeat_interval: float
|
272
|
+
) -> bool:
|
271
273
|
"""Acknowledge a heartbeat received from a node.
|
272
274
|
|
273
275
|
A node is considered online as long as it sends heartbeats within
|
@@ -926,7 +926,9 @@ class SqliteLinkState(LinkState): # pylint: disable=R0904
|
|
926
926
|
row = rows[0]
|
927
927
|
return configrecord_from_bytes(row["federation_options"])
|
928
928
|
|
929
|
-
def
|
929
|
+
def acknowledge_node_heartbeat(
|
930
|
+
self, node_id: int, heartbeat_interval: float
|
931
|
+
) -> bool:
|
930
932
|
"""Acknowledge a heartbeat received from a node, serving as a heartbeat.
|
931
933
|
|
932
934
|
A node is considered online as long as it sends heartbeats within
|
{flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/METADATA
RENAMED
@@ -1,8 +1,7 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: flwr-nightly
|
3
|
-
Version: 1.19.0.
|
3
|
+
Version: 1.19.0.dev20250507
|
4
4
|
Summary: Flower: A Friendly Federated AI Framework
|
5
|
-
Home-page: https://flower.ai
|
6
5
|
License: Apache-2.0
|
7
6
|
Keywords: Artificial Intelligence,Federated AI,Federated Analytics,Federated Evaluation,Federated Learning,Flower,Machine Learning
|
8
7
|
Author: The Flower Authors
|
@@ -19,8 +18,8 @@ Classifier: Programming Language :: Python :: 3
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.10
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
22
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
23
21
|
Classifier: Programming Language :: Python :: 3.13
|
22
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
24
23
|
Classifier: Programming Language :: Python :: 3.9
|
25
24
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
26
25
|
Classifier: Topic :: Scientific/Engineering
|
@@ -49,6 +48,7 @@ Requires-Dist: tomli-w (>=1.0.0,<2.0.0)
|
|
49
48
|
Requires-Dist: typer (>=0.12.5,<0.13.0)
|
50
49
|
Requires-Dist: uvicorn[standard] (>=0.34.0,<0.35.0) ; extra == "rest"
|
51
50
|
Project-URL: Documentation, https://flower.ai
|
51
|
+
Project-URL: Homepage, https://flower.ai
|
52
52
|
Project-URL: Repository, https://github.com/adap/flower
|
53
53
|
Description-Content-Type: text/markdown
|
54
54
|
|
{flwr_nightly-1.19.0.dev20250501.dist-info → flwr_nightly-1.19.0.dev20250507.dist-info}/RECORD
RENAMED
@@ -86,8 +86,8 @@ flwr/client/grpc_client/__init__.py,sha256=MDOckOODn-FJnkkFEfb2JO-2G97wrBr_TTqht
|
|
86
86
|
flwr/client/grpc_client/connection.py,sha256=xAyvcTVr7bkwUfR5P3D_LKlZYiyySpt5sEwORA1h8Gc,9189
|
87
87
|
flwr/client/grpc_rere_client/__init__.py,sha256=i7iS0Lt8B7q0E2L72e4F_YrKm6ClRKnd71PNA6PW2O0,752
|
88
88
|
flwr/client/grpc_rere_client/client_interceptor.py,sha256=zFaVHw6AxeNO-7eCKKb-RxrPa7zbM5Z-2-1Efc4adQY,2451
|
89
|
-
flwr/client/grpc_rere_client/connection.py,sha256=
|
90
|
-
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=
|
89
|
+
flwr/client/grpc_rere_client/connection.py,sha256=Ukvvf0VGwYfcYIESpD49cw_TpvPke0dp7bGHbsnbmd0,12035
|
90
|
+
flwr/client/grpc_rere_client/grpc_adapter.py,sha256=iFmNZIlM6bpUe3yp35EcFMKBhy6S5zupd7Yi_NwlZ_4,5745
|
91
91
|
flwr/client/message_handler/__init__.py,sha256=0lyljDVqre3WljiZbPcwCCf8GiIaSVI_yo_ylEyPwSE,719
|
92
92
|
flwr/client/message_handler/message_handler.py,sha256=-vZKGg2gP81182LFXDmiZtajLlIfZjV6FyMS43qQVwU,6532
|
93
93
|
flwr/client/mod/__init__.py,sha256=AtV4Y5UGuYqJdTg7bJ--KtfOZUYLGDPMy616LvtP5W4,1151
|
@@ -104,7 +104,7 @@ flwr/client/nodestate/nodestate.py,sha256=-LAjZOnS7VyHC05ll3b31cYDjwAt6l4WmYt7du
|
|
104
104
|
flwr/client/nodestate/nodestate_factory.py,sha256=UYTDCcwK_baHUmkzkJDxL0UEqvtTfOMlQRrROMCd0Xo,1430
|
105
105
|
flwr/client/numpy_client.py,sha256=Qq6ghsIAop2slKqAfgiI5NiHJ4LIxGmrik3Ror4_XVc,9581
|
106
106
|
flwr/client/rest_client/__init__.py,sha256=MBiuK62hj439m9rtwSwI184Hth6Tt5GbmpNMyl3zkZY,735
|
107
|
-
flwr/client/rest_client/connection.py,sha256=
|
107
|
+
flwr/client/rest_client/connection.py,sha256=s8dfD7T6ZR3X-AGUr6hM437HkLiddyVuaBlKUViIFWY,12777
|
108
108
|
flwr/client/run_info_store.py,sha256=MaJ3UQ-07hWtK67wnWu0zR29jrk0fsfgJX506dvEOfE,4042
|
109
109
|
flwr/client/supernode/__init__.py,sha256=i3gFbV5ie_FGyRMpzOvqtZAi0Z0ChIEJ7I2Kr0ym0PM,793
|
110
110
|
flwr/client/supernode/app.py,sha256=lURLjP8jiOWhlX3-uh-7t_l1o_JEUz_FmkuNY91xmUQ,8975
|
@@ -173,14 +173,18 @@ flwr/proto/fab_pb2.py,sha256=2Nu0WaWxDZ8TbutMtctjdcGM7OtXiyP4kmCgg5o7Jjw,1627
|
|
173
173
|
flwr/proto/fab_pb2.pyi,sha256=AMXpiDK0fo3nZWjxsC2E4otSaVjyQbU7iiWKrsSZavs,2395
|
174
174
|
flwr/proto/fab_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
175
175
|
flwr/proto/fab_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
176
|
-
flwr/proto/fleet_pb2.py,sha256=
|
177
|
-
flwr/proto/fleet_pb2.pyi,sha256=
|
178
|
-
flwr/proto/fleet_pb2_grpc.py,sha256=
|
179
|
-
flwr/proto/fleet_pb2_grpc.pyi,sha256=
|
176
|
+
flwr/proto/fleet_pb2.py,sha256=3URNlCJZcJm0bh-YeG-r9dTNgo9kc2JAn-zhsKr6l7U,4592
|
177
|
+
flwr/proto/fleet_pb2.pyi,sha256=ugXXUx2K6mbeWqOxBzoa2B1Uc2d2d03T2z8wS56vLD0,6777
|
178
|
+
flwr/proto/fleet_pb2_grpc.py,sha256=eJHJX3K33js5jQ0jYPHSWRkBFDX2dSEuqiXZSQ3YfoE,12527
|
179
|
+
flwr/proto/fleet_pb2_grpc.pyi,sha256=K-wyX8k7zs6isiEIzxFTNYAydekb9ptJHzzp-PuTeQ0,3366
|
180
180
|
flwr/proto/grpcadapter_pb2.py,sha256=PJ8DtfeV29g_y4Z3aNZlSZocLqSxeLmTsYCdOZDYCiE,1843
|
181
181
|
flwr/proto/grpcadapter_pb2.pyi,sha256=AR77gDsF6f8zqSIQp3877DUd7S8lP95lFak5Ir_WPkw,1716
|
182
182
|
flwr/proto/grpcadapter_pb2_grpc.py,sha256=rRNuNES5nBugUZWfeA8oAy8dMHgzqU_PF1srTseo3b8,2634
|
183
183
|
flwr/proto/grpcadapter_pb2_grpc.pyi,sha256=AgA9Qo_lnANb9SNuPzbZGAxupau-xcqYawZz6vqf-24,735
|
184
|
+
flwr/proto/heartbeat_pb2.py,sha256=gC2lGgio5Fn1U7fbb64JuQ1wM8cK7e2I05x9BtAuAuo,1482
|
185
|
+
flwr/proto/heartbeat_pb2.pyi,sha256=5VP-zdZUJRva-F4JydpDmMZ5VyE1CipR0l8Gk0Kj2cU,1534
|
186
|
+
flwr/proto/heartbeat_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
187
|
+
flwr/proto/heartbeat_pb2_grpc.pyi,sha256=ff2TSiLVnG6IVQcTGzb2DIH3XRSoAvAo_RMcvbMFyc0,76
|
184
188
|
flwr/proto/log_pb2.py,sha256=iKaS3MVn1BS4xHu8uGPFCOi1KWtvVx-H9V4jCUIJghs,1393
|
185
189
|
flwr/proto/log_pb2.pyi,sha256=ipuhgo40sAHTcRzCsGI1HwIstr5q0THPNk_cf62YyME,1448
|
186
190
|
flwr/proto/log_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
@@ -268,29 +272,29 @@ flwr/server/superlink/ffs/ffs.py,sha256=6w7wy71i7tbuJwqEgdeCa49JejXMEof3jujURN_R
|
|
268
272
|
flwr/server/superlink/ffs/ffs_factory.py,sha256=pK-g3LMelvWTV6N9Cd-j-_-FdcGbRFTKNsWaqmlBDSk,1490
|
269
273
|
flwr/server/superlink/fleet/__init__.py,sha256=Uiwr33yfW_eL-pEfj80c_JUhIKRkCPsN1JSs2v4aglU,711
|
270
274
|
flwr/server/superlink/fleet/grpc_adapter/__init__.py,sha256=fUu1V63YrzjxAOZnBJx99WjuD4Mro7dJIFH-1V4NLV8,742
|
271
|
-
flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py,sha256=
|
275
|
+
flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py,sha256=78oXtJ1wsi2eNj_tk2rUbBxWi04PX_n9uz-2iIkG7mQ,4299
|
272
276
|
flwr/server/superlink/fleet/grpc_bidi/__init__.py,sha256=dOM49q1b9MrtUr5jldjEnQ38NhcUyYs-zC3gsJb1TtI,735
|
273
277
|
flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py,sha256=UKEp-3YBaTvNt7vKZW7KLgK5xsAiO7jxU-omG7CaO_s,6021
|
274
278
|
flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py,sha256=KouR9PUcrPmMtoLooF4O9SRAwIvfiroo8mPmqUc2EZc,6485
|
275
279
|
flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=iSf0mbBAlig7G6subQwBSVjcUCgSihONKdZ1RmQPTOk,4887
|
276
280
|
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=OsS-6GgCIzMMZDVu5Y-OKjynHVUrpdc_5OrtuB-IbU0,5174
|
277
281
|
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=ahDJJ1e-lDxBpeBMgPk7YZt2wB38_QltcpOC0gLbpFs,758
|
278
|
-
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=
|
282
|
+
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=lwGYN_BZzth106HmWOS57MJEqDwa7mn5Kct7Vn-veOw,5758
|
279
283
|
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=DrHubsaLgJCwCeeJPYogQTiP0xYqjxwnT9rh7OP7BoU,6984
|
280
284
|
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=fHsRV0KvJ8HtgSA4_YBsEzuhJLjO8p6xx4aCY2oE1p4,731
|
281
|
-
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=
|
285
|
+
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=56LC_cPa_pZT1715WTCN0d7MmvdRXlyO7g_hb9zdJrA,5427
|
282
286
|
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=Lzc93nA7tDqoy-zRUaPG316oqFiZX1HUCL5ELaXY_xw,735
|
283
|
-
flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=
|
287
|
+
flwr/server/superlink/fleet/rest_rere/rest_api.py,sha256=s6SNp_z-Uyr4tT4C5PqSbeJySfvsdK1SIczwwxrljO8,6923
|
284
288
|
flwr/server/superlink/fleet/vce/__init__.py,sha256=XOKbAWOzlCqEOQ3M2cBYkH7HKA7PxlbCJMunt-ty-DY,784
|
285
289
|
flwr/server/superlink/fleet/vce/backend/__init__.py,sha256=PPH89Yqd1XKm-sRJN6R0WQlKT_b4v54Kzl2yzHAFzM8,1437
|
286
290
|
flwr/server/superlink/fleet/vce/backend/backend.py,sha256=-wDHjgAy5mrfEgXj0GxkJI7lhEbgSUyPwmNAf9ZcDzc,2193
|
287
291
|
flwr/server/superlink/fleet/vce/backend/raybackend.py,sha256=Hx9hxL7lju1_VJoAwkhBOGerZ3628u0P1zgkPhGWRPY,7154
|
288
292
|
flwr/server/superlink/fleet/vce/vce_api.py,sha256=m7WUiHRl-jTqzjH3cqNCj3RXe3ohT6V6I0JIR6zWZj8,12780
|
289
293
|
flwr/server/superlink/linkstate/__init__.py,sha256=OtsgvDTnZLU3k0sUbkHbqoVwW6ql2FDmb6uT6DbNkZo,1064
|
290
|
-
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=
|
291
|
-
flwr/server/superlink/linkstate/linkstate.py,sha256=
|
294
|
+
flwr/server/superlink/linkstate/in_memory_linkstate.py,sha256=vu36ntb9N1qeDWvt6YsnPfvVppZPJi04icAgolui9no,22520
|
295
|
+
flwr/server/superlink/linkstate/linkstate.py,sha256=zrVR9UpeuCfgqK5MDIqudcXtFjvsCRjD2ylv4UZu8MU,12140
|
292
296
|
flwr/server/superlink/linkstate/linkstate_factory.py,sha256=8RlosqSpKOoD_vhUUQPY0jtE3A84GeF96Z7sWNkRRcA,2069
|
293
|
-
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=
|
297
|
+
flwr/server/superlink/linkstate/sqlite_linkstate.py,sha256=c-6iopBJ3Y09Jh0qYka02tdIUF3Aq9X0nrBK5eAuwOk,39847
|
294
298
|
flwr/server/superlink/linkstate/utils.py,sha256=AJs9jTAEK7JnjF2AODXnOfy0pKAKpe6oUWPCanAP57s,15382
|
295
299
|
flwr/server/superlink/serverappio/__init__.py,sha256=Fy4zJuoccZe5mZSEIpOmQvU6YeXFBa1M4eZuXXmJcn8,717
|
296
300
|
flwr/server/superlink/serverappio/serverappio_grpc.py,sha256=opJ6SYwIAbu4NWEo3K-VxFO-tMSFmE4H3i2HwHIVRzw,2173
|
@@ -327,7 +331,7 @@ flwr/superexec/exec_servicer.py,sha256=Z0YYfs6eNPhqn8rY0x_R04XgR2mKFpggt07IH0EhU
|
|
327
331
|
flwr/superexec/exec_user_auth_interceptor.py,sha256=iqygALkOMBUu_s_R9G0mFThZA7HTUzuXCLgxLCefiwI,4440
|
328
332
|
flwr/superexec/executor.py,sha256=M5ucqSE53jfRtuCNf59WFLqQvA1Mln4741TySeZE7qQ,3112
|
329
333
|
flwr/superexec/simulation.py,sha256=j6YwUvBN7EQ09ID7MYOCVZ70PGbuyBy8f9bXU0EszEM,4088
|
330
|
-
flwr_nightly-1.19.0.
|
331
|
-
flwr_nightly-1.19.0.
|
332
|
-
flwr_nightly-1.19.0.
|
333
|
-
flwr_nightly-1.19.0.
|
334
|
+
flwr_nightly-1.19.0.dev20250507.dist-info/METADATA,sha256=2VAe3nq067aoWQnhHrtXYi8m9uT7Q1RJOLgGNoBy-zs,15880
|
335
|
+
flwr_nightly-1.19.0.dev20250507.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
336
|
+
flwr_nightly-1.19.0.dev20250507.dist-info/entry_points.txt,sha256=2-1L-GNKhwGw2_7_RoH55vHw2SIHjdAQy3HAVAWl9PY,374
|
337
|
+
flwr_nightly-1.19.0.dev20250507.dist-info/RECORD,,
|
File without changes
|