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.
Files changed (286) hide show
  1. flwr/__init__.py +1 -1
  2. flwr/app/__init__.py +15 -0
  3. flwr/app/error.py +68 -0
  4. flwr/app/metadata.py +223 -0
  5. flwr/cli/__init__.py +1 -1
  6. flwr/cli/app.py +21 -2
  7. flwr/cli/build.py +83 -58
  8. flwr/cli/cli_user_auth_interceptor.py +1 -1
  9. flwr/cli/config_utils.py +53 -17
  10. flwr/cli/example.py +1 -1
  11. flwr/cli/install.py +1 -1
  12. flwr/cli/log.py +4 -4
  13. flwr/cli/login/__init__.py +1 -1
  14. flwr/cli/login/login.py +15 -8
  15. flwr/cli/ls.py +16 -37
  16. flwr/cli/new/__init__.py +1 -1
  17. flwr/cli/new/new.py +4 -4
  18. flwr/cli/new/templates/__init__.py +1 -1
  19. flwr/cli/new/templates/app/__init__.py +1 -1
  20. flwr/cli/new/templates/app/code/__init__.py +1 -1
  21. flwr/cli/new/templates/app/code/client.baseline.py.tpl +1 -1
  22. flwr/cli/new/templates/app/code/flwr_tune/__init__.py +1 -1
  23. flwr/cli/new/templates/app/code/flwr_tune/client_app.py.tpl +4 -4
  24. flwr/cli/new/templates/app/code/model.baseline.py.tpl +1 -1
  25. flwr/cli/new/templates/app/code/server.baseline.py.tpl +2 -3
  26. flwr/cli/new/templates/app/code/task.sklearn.py.tpl +1 -1
  27. flwr/cli/new/templates/app/pyproject.baseline.toml.tpl +14 -17
  28. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +4 -4
  29. flwr/cli/new/templates/app/pyproject.huggingface.toml.tpl +1 -1
  30. flwr/cli/new/templates/app/pyproject.jax.toml.tpl +1 -1
  31. flwr/cli/new/templates/app/pyproject.mlx.toml.tpl +1 -1
  32. flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +1 -1
  33. flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +1 -1
  34. flwr/cli/new/templates/app/pyproject.sklearn.toml.tpl +1 -1
  35. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  36. flwr/cli/run/__init__.py +1 -1
  37. flwr/cli/run/run.py +11 -19
  38. flwr/cli/stop.py +3 -3
  39. flwr/cli/utils.py +42 -17
  40. flwr/client/__init__.py +3 -3
  41. flwr/client/client.py +1 -1
  42. flwr/client/client_app.py +140 -138
  43. flwr/client/clientapp/__init__.py +1 -8
  44. flwr/client/clientapp/utils.py +1 -1
  45. flwr/client/dpfedavg_numpy_client.py +1 -1
  46. flwr/client/grpc_adapter_client/__init__.py +1 -1
  47. flwr/client/grpc_adapter_client/connection.py +5 -5
  48. flwr/client/grpc_rere_client/__init__.py +1 -1
  49. flwr/client/grpc_rere_client/client_interceptor.py +1 -1
  50. flwr/client/grpc_rere_client/connection.py +131 -61
  51. flwr/client/grpc_rere_client/grpc_adapter.py +35 -7
  52. flwr/client/message_handler/__init__.py +1 -1
  53. flwr/client/message_handler/message_handler.py +2 -2
  54. flwr/client/mod/__init__.py +1 -1
  55. flwr/client/mod/centraldp_mods.py +1 -1
  56. flwr/client/mod/comms_mods.py +39 -20
  57. flwr/client/mod/localdp_mod.py +6 -6
  58. flwr/client/mod/secure_aggregation/__init__.py +1 -1
  59. flwr/client/mod/secure_aggregation/secagg_mod.py +1 -1
  60. flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
  61. flwr/client/mod/utils.py +1 -1
  62. flwr/client/numpy_client.py +1 -1
  63. flwr/client/rest_client/__init__.py +1 -1
  64. flwr/client/rest_client/connection.py +174 -68
  65. flwr/client/run_info_store.py +1 -1
  66. flwr/client/typing.py +1 -1
  67. flwr/clientapp/__init__.py +15 -0
  68. flwr/common/__init__.py +3 -3
  69. flwr/common/address.py +1 -1
  70. flwr/common/args.py +1 -1
  71. flwr/common/auth_plugin/__init__.py +3 -1
  72. flwr/common/auth_plugin/auth_plugin.py +30 -4
  73. flwr/common/config.py +1 -1
  74. flwr/common/constant.py +37 -8
  75. flwr/common/context.py +1 -1
  76. flwr/common/date.py +1 -1
  77. flwr/common/differential_privacy.py +1 -1
  78. flwr/common/differential_privacy_constants.py +1 -1
  79. flwr/common/dp.py +1 -1
  80. flwr/common/event_log_plugin/event_log_plugin.py +3 -3
  81. flwr/common/exit/exit.py +6 -6
  82. flwr/common/exit_handlers.py +31 -1
  83. flwr/common/grpc.py +1 -1
  84. flwr/common/heartbeat.py +165 -0
  85. flwr/common/inflatable.py +290 -0
  86. flwr/common/inflatable_grpc_utils.py +99 -0
  87. flwr/common/inflatable_rest_utils.py +99 -0
  88. flwr/common/inflatable_utils.py +341 -0
  89. flwr/common/logger.py +1 -1
  90. flwr/common/message.py +137 -252
  91. flwr/common/object_ref.py +1 -1
  92. flwr/common/parameter.py +1 -1
  93. flwr/common/pyproject.py +1 -1
  94. flwr/common/record/__init__.py +3 -2
  95. flwr/common/record/array.py +323 -0
  96. flwr/common/record/arrayrecord.py +121 -243
  97. flwr/common/record/configrecord.py +71 -16
  98. flwr/common/record/conversion_utils.py +2 -2
  99. flwr/common/record/metricrecord.py +71 -20
  100. flwr/common/record/recorddict.py +207 -90
  101. flwr/common/record/typeddict.py +1 -1
  102. flwr/common/recorddict_compat.py +2 -2
  103. flwr/common/retry_invoker.py +15 -11
  104. flwr/common/secure_aggregation/__init__.py +1 -1
  105. flwr/common/secure_aggregation/crypto/__init__.py +1 -1
  106. flwr/common/secure_aggregation/crypto/shamir.py +52 -30
  107. flwr/common/secure_aggregation/crypto/symmetric_encryption.py +1 -1
  108. flwr/common/secure_aggregation/ndarrays_arithmetic.py +1 -1
  109. flwr/common/secure_aggregation/quantization.py +1 -1
  110. flwr/common/secure_aggregation/secaggplus_constants.py +1 -1
  111. flwr/common/secure_aggregation/secaggplus_utils.py +1 -1
  112. flwr/common/serde.py +60 -184
  113. flwr/common/serde_utils.py +175 -0
  114. flwr/common/telemetry.py +2 -2
  115. flwr/common/typing.py +6 -4
  116. flwr/common/version.py +1 -1
  117. flwr/compat/__init__.py +15 -0
  118. flwr/compat/client/__init__.py +15 -0
  119. flwr/{client → compat/client}/app.py +71 -211
  120. flwr/{client → compat/client}/grpc_client/__init__.py +1 -1
  121. flwr/{client → compat/client}/grpc_client/connection.py +13 -13
  122. flwr/compat/common/__init__.py +15 -0
  123. flwr/compat/server/__init__.py +15 -0
  124. flwr/compat/server/app.py +174 -0
  125. flwr/compat/simulation/__init__.py +15 -0
  126. flwr/proto/__init__.py +1 -1
  127. flwr/proto/fleet_pb2.py +32 -27
  128. flwr/proto/fleet_pb2.pyi +49 -35
  129. flwr/proto/fleet_pb2_grpc.py +117 -13
  130. flwr/proto/fleet_pb2_grpc.pyi +47 -6
  131. flwr/proto/heartbeat_pb2.py +33 -0
  132. flwr/proto/heartbeat_pb2.pyi +66 -0
  133. flwr/proto/heartbeat_pb2_grpc.py +4 -0
  134. flwr/proto/heartbeat_pb2_grpc.pyi +4 -0
  135. flwr/proto/message_pb2.py +28 -11
  136. flwr/proto/message_pb2.pyi +125 -0
  137. flwr/proto/recorddict_pb2.py +16 -28
  138. flwr/proto/recorddict_pb2.pyi +46 -64
  139. flwr/proto/run_pb2.py +24 -32
  140. flwr/proto/run_pb2.pyi +4 -52
  141. flwr/proto/serverappio_pb2.py +32 -23
  142. flwr/proto/serverappio_pb2.pyi +45 -3
  143. flwr/proto/serverappio_pb2_grpc.py +138 -34
  144. flwr/proto/serverappio_pb2_grpc.pyi +54 -13
  145. flwr/proto/simulationio_pb2.py +12 -11
  146. flwr/proto/simulationio_pb2_grpc.py +35 -0
  147. flwr/proto/simulationio_pb2_grpc.pyi +14 -0
  148. flwr/server/__init__.py +2 -2
  149. flwr/server/app.py +69 -187
  150. flwr/server/client_manager.py +1 -1
  151. flwr/server/client_proxy.py +1 -1
  152. flwr/server/compat/__init__.py +1 -1
  153. flwr/server/compat/app.py +1 -1
  154. flwr/server/compat/app_utils.py +51 -29
  155. flwr/server/compat/legacy_context.py +1 -1
  156. flwr/server/criterion.py +1 -1
  157. flwr/server/fleet_event_log_interceptor.py +2 -2
  158. flwr/server/grid/grid.py +3 -3
  159. flwr/server/grid/grpc_grid.py +104 -34
  160. flwr/server/grid/inmemory_grid.py +5 -4
  161. flwr/server/history.py +1 -1
  162. flwr/server/run_serverapp.py +1 -1
  163. flwr/server/server.py +1 -1
  164. flwr/server/server_app.py +65 -58
  165. flwr/server/server_config.py +1 -1
  166. flwr/server/serverapp/__init__.py +1 -1
  167. flwr/server/serverapp/app.py +19 -1
  168. flwr/server/serverapp_components.py +1 -1
  169. flwr/server/strategy/__init__.py +1 -1
  170. flwr/server/strategy/aggregate.py +1 -1
  171. flwr/server/strategy/bulyan.py +2 -2
  172. flwr/server/strategy/dp_adaptive_clipping.py +17 -17
  173. flwr/server/strategy/dp_fixed_clipping.py +17 -17
  174. flwr/server/strategy/dpfedavg_adaptive.py +1 -1
  175. flwr/server/strategy/dpfedavg_fixed.py +1 -1
  176. flwr/server/strategy/fault_tolerant_fedavg.py +1 -1
  177. flwr/server/strategy/fedadagrad.py +1 -1
  178. flwr/server/strategy/fedadam.py +1 -1
  179. flwr/server/strategy/fedavg.py +1 -1
  180. flwr/server/strategy/fedavg_android.py +1 -1
  181. flwr/server/strategy/fedavgm.py +1 -1
  182. flwr/server/strategy/fedmedian.py +1 -1
  183. flwr/server/strategy/fedopt.py +1 -1
  184. flwr/server/strategy/fedprox.py +1 -1
  185. flwr/server/strategy/fedtrimmedavg.py +1 -1
  186. flwr/server/strategy/fedxgb_bagging.py +1 -1
  187. flwr/server/strategy/fedxgb_cyclic.py +1 -1
  188. flwr/server/strategy/fedxgb_nn_avg.py +3 -2
  189. flwr/server/strategy/fedyogi.py +1 -1
  190. flwr/server/strategy/krum.py +1 -1
  191. flwr/server/strategy/qfedavg.py +1 -1
  192. flwr/server/strategy/strategy.py +1 -1
  193. flwr/server/superlink/__init__.py +1 -1
  194. flwr/server/superlink/ffs/__init__.py +3 -1
  195. flwr/server/superlink/ffs/disk_ffs.py +1 -1
  196. flwr/server/superlink/ffs/ffs.py +1 -1
  197. flwr/server/superlink/ffs/ffs_factory.py +1 -1
  198. flwr/server/superlink/fleet/__init__.py +1 -1
  199. flwr/server/superlink/fleet/grpc_adapter/__init__.py +1 -1
  200. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +14 -4
  201. flwr/server/superlink/fleet/grpc_bidi/__init__.py +1 -1
  202. flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +1 -1
  203. flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +1 -1
  204. flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +1 -1
  205. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +13 -13
  206. flwr/server/superlink/fleet/grpc_rere/__init__.py +1 -1
  207. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +102 -8
  208. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +1 -1
  209. flwr/server/superlink/fleet/message_handler/__init__.py +1 -1
  210. flwr/server/superlink/fleet/message_handler/message_handler.py +136 -19
  211. flwr/server/superlink/fleet/rest_rere/__init__.py +1 -1
  212. flwr/server/superlink/fleet/rest_rere/rest_api.py +73 -12
  213. flwr/server/superlink/fleet/vce/__init__.py +1 -1
  214. flwr/server/superlink/fleet/vce/backend/__init__.py +1 -1
  215. flwr/server/superlink/fleet/vce/backend/backend.py +1 -1
  216. flwr/server/superlink/fleet/vce/backend/raybackend.py +1 -1
  217. flwr/server/superlink/fleet/vce/vce_api.py +7 -4
  218. flwr/server/superlink/linkstate/__init__.py +1 -1
  219. flwr/server/superlink/linkstate/in_memory_linkstate.py +139 -44
  220. flwr/server/superlink/linkstate/linkstate.py +54 -21
  221. flwr/server/superlink/linkstate/linkstate_factory.py +1 -1
  222. flwr/server/superlink/linkstate/sqlite_linkstate.py +150 -56
  223. flwr/server/superlink/linkstate/utils.py +34 -30
  224. flwr/server/superlink/serverappio/serverappio_grpc.py +3 -0
  225. flwr/server/superlink/serverappio/serverappio_servicer.py +211 -57
  226. flwr/server/superlink/simulation/__init__.py +1 -1
  227. flwr/server/superlink/simulation/simulationio_grpc.py +1 -1
  228. flwr/server/superlink/simulation/simulationio_servicer.py +26 -2
  229. flwr/server/superlink/utils.py +45 -3
  230. flwr/server/typing.py +1 -1
  231. flwr/server/utils/__init__.py +1 -1
  232. flwr/server/utils/tensorboard.py +1 -1
  233. flwr/server/utils/validator.py +3 -3
  234. flwr/server/workflow/__init__.py +1 -1
  235. flwr/server/workflow/constant.py +1 -1
  236. flwr/server/workflow/default_workflows.py +1 -1
  237. flwr/server/workflow/secure_aggregation/__init__.py +1 -1
  238. flwr/server/workflow/secure_aggregation/secagg_workflow.py +1 -1
  239. flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +1 -1
  240. flwr/serverapp/__init__.py +15 -0
  241. flwr/simulation/__init__.py +1 -1
  242. flwr/simulation/app.py +18 -1
  243. flwr/simulation/legacy_app.py +1 -1
  244. flwr/simulation/ray_transport/__init__.py +1 -1
  245. flwr/simulation/ray_transport/ray_actor.py +1 -1
  246. flwr/simulation/ray_transport/ray_client_proxy.py +1 -1
  247. flwr/simulation/ray_transport/utils.py +1 -1
  248. flwr/simulation/run_simulation.py +2 -2
  249. flwr/simulation/simulationio_connection.py +1 -1
  250. flwr/supercore/__init__.py +15 -0
  251. flwr/supercore/object_store/__init__.py +24 -0
  252. flwr/supercore/object_store/in_memory_object_store.py +229 -0
  253. flwr/supercore/object_store/object_store.py +192 -0
  254. flwr/supercore/object_store/object_store_factory.py +44 -0
  255. flwr/superexec/__init__.py +1 -1
  256. flwr/superexec/app.py +1 -1
  257. flwr/superexec/deployment.py +7 -3
  258. flwr/superexec/exec_event_log_interceptor.py +4 -4
  259. flwr/superexec/exec_grpc.py +8 -4
  260. flwr/superexec/exec_servicer.py +126 -24
  261. flwr/superexec/exec_user_auth_interceptor.py +38 -9
  262. flwr/superexec/executor.py +5 -1
  263. flwr/superexec/simulation.py +8 -2
  264. flwr/superlink/__init__.py +15 -0
  265. flwr/{client/supernode → supernode}/__init__.py +1 -8
  266. flwr/{client/nodestate/nodestate.py → supernode/cli/__init__.py} +8 -15
  267. flwr/{client/supernode/app.py → supernode/cli/flower_supernode.py} +4 -13
  268. flwr/supernode/cli/flwr_clientapp.py +81 -0
  269. flwr/{client → supernode}/nodestate/__init__.py +1 -1
  270. flwr/supernode/nodestate/in_memory_nodestate.py +190 -0
  271. flwr/supernode/nodestate/nodestate.py +212 -0
  272. flwr/{client → supernode}/nodestate/nodestate_factory.py +1 -1
  273. flwr/supernode/runtime/__init__.py +15 -0
  274. flwr/{client/clientapp/app.py → supernode/runtime/run_clientapp.py} +26 -57
  275. flwr/supernode/servicer/__init__.py +15 -0
  276. flwr/supernode/servicer/clientappio/__init__.py +24 -0
  277. flwr/{client/clientapp → supernode/servicer/clientappio}/clientappio_servicer.py +1 -1
  278. flwr/supernode/start_client_internal.py +491 -0
  279. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/METADATA +6 -5
  280. flwr-1.19.0.dist-info/RECORD +365 -0
  281. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/WHEEL +1 -1
  282. {flwr-1.17.0.dist-info → flwr-1.19.0.dist-info}/entry_points.txt +2 -2
  283. flwr/client/heartbeat.py +0 -74
  284. flwr/client/nodestate/in_memory_nodestate.py +0 -38
  285. flwr-1.17.0.dist-info/LICENSE +0 -202
  286. flwr-1.17.0.dist-info/RECORD +0 -333
@@ -3,7 +3,9 @@
3
3
  import grpc
4
4
 
5
5
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
6
+ from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
6
7
  from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
8
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
7
9
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
8
10
  from flwr.proto import serverappio_pb2 as flwr_dot_proto_dot_serverappio__pb2
9
11
 
@@ -17,11 +19,6 @@ class ServerAppIoStub(object):
17
19
  Args:
18
20
  channel: A grpc.Channel.
19
21
  """
20
- self.CreateRun = channel.unary_unary(
21
- '/flwr.proto.ServerAppIo/CreateRun',
22
- request_serializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
23
- response_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
24
- )
25
22
  self.GetNodes = channel.unary_unary(
26
23
  '/flwr.proto.ServerAppIo/GetNodes',
27
24
  request_serializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.SerializeToString,
@@ -72,18 +69,31 @@ class ServerAppIoStub(object):
72
69
  request_serializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.SerializeToString,
73
70
  response_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
74
71
  )
72
+ self.SendAppHeartbeat = channel.unary_unary(
73
+ '/flwr.proto.ServerAppIo/SendAppHeartbeat',
74
+ request_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.SerializeToString,
75
+ response_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.FromString,
76
+ )
77
+ self.PushObject = channel.unary_unary(
78
+ '/flwr.proto.ServerAppIo/PushObject',
79
+ request_serializer=flwr_dot_proto_dot_message__pb2.PushObjectRequest.SerializeToString,
80
+ response_deserializer=flwr_dot_proto_dot_message__pb2.PushObjectResponse.FromString,
81
+ )
82
+ self.PullObject = channel.unary_unary(
83
+ '/flwr.proto.ServerAppIo/PullObject',
84
+ request_serializer=flwr_dot_proto_dot_message__pb2.PullObjectRequest.SerializeToString,
85
+ response_deserializer=flwr_dot_proto_dot_message__pb2.PullObjectResponse.FromString,
86
+ )
87
+ self.ConfirmMessageReceived = channel.unary_unary(
88
+ '/flwr.proto.ServerAppIo/ConfirmMessageReceived',
89
+ request_serializer=flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedRequest.SerializeToString,
90
+ response_deserializer=flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedResponse.FromString,
91
+ )
75
92
 
76
93
 
77
94
  class ServerAppIoServicer(object):
78
95
  """Missing associated documentation comment in .proto file."""
79
96
 
80
- def CreateRun(self, request, context):
81
- """Request run_id
82
- """
83
- context.set_code(grpc.StatusCode.UNIMPLEMENTED)
84
- context.set_details('Method not implemented!')
85
- raise NotImplementedError('Method not implemented!')
86
-
87
97
  def GetNodes(self, request, context):
88
98
  """Return a set of nodes
89
99
  """
@@ -154,14 +164,37 @@ class ServerAppIoServicer(object):
154
164
  context.set_details('Method not implemented!')
155
165
  raise NotImplementedError('Method not implemented!')
156
166
 
167
+ def SendAppHeartbeat(self, request, context):
168
+ """Heartbeat
169
+ """
170
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
171
+ context.set_details('Method not implemented!')
172
+ raise NotImplementedError('Method not implemented!')
173
+
174
+ def PushObject(self, request, context):
175
+ """Push Object
176
+ """
177
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
178
+ context.set_details('Method not implemented!')
179
+ raise NotImplementedError('Method not implemented!')
180
+
181
+ def PullObject(self, request, context):
182
+ """Pull Object
183
+ """
184
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
185
+ context.set_details('Method not implemented!')
186
+ raise NotImplementedError('Method not implemented!')
187
+
188
+ def ConfirmMessageReceived(self, request, context):
189
+ """Confirm Message Received
190
+ """
191
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
192
+ context.set_details('Method not implemented!')
193
+ raise NotImplementedError('Method not implemented!')
194
+
157
195
 
158
196
  def add_ServerAppIoServicer_to_server(servicer, server):
159
197
  rpc_method_handlers = {
160
- 'CreateRun': grpc.unary_unary_rpc_method_handler(
161
- servicer.CreateRun,
162
- request_deserializer=flwr_dot_proto_dot_run__pb2.CreateRunRequest.FromString,
163
- response_serializer=flwr_dot_proto_dot_run__pb2.CreateRunResponse.SerializeToString,
164
- ),
165
198
  'GetNodes': grpc.unary_unary_rpc_method_handler(
166
199
  servicer.GetNodes,
167
200
  request_deserializer=flwr_dot_proto_dot_serverappio__pb2.GetNodesRequest.FromString,
@@ -212,6 +245,26 @@ def add_ServerAppIoServicer_to_server(servicer, server):
212
245
  request_deserializer=flwr_dot_proto_dot_log__pb2.PushLogsRequest.FromString,
213
246
  response_serializer=flwr_dot_proto_dot_log__pb2.PushLogsResponse.SerializeToString,
214
247
  ),
248
+ 'SendAppHeartbeat': grpc.unary_unary_rpc_method_handler(
249
+ servicer.SendAppHeartbeat,
250
+ request_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.FromString,
251
+ response_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.SerializeToString,
252
+ ),
253
+ 'PushObject': grpc.unary_unary_rpc_method_handler(
254
+ servicer.PushObject,
255
+ request_deserializer=flwr_dot_proto_dot_message__pb2.PushObjectRequest.FromString,
256
+ response_serializer=flwr_dot_proto_dot_message__pb2.PushObjectResponse.SerializeToString,
257
+ ),
258
+ 'PullObject': grpc.unary_unary_rpc_method_handler(
259
+ servicer.PullObject,
260
+ request_deserializer=flwr_dot_proto_dot_message__pb2.PullObjectRequest.FromString,
261
+ response_serializer=flwr_dot_proto_dot_message__pb2.PullObjectResponse.SerializeToString,
262
+ ),
263
+ 'ConfirmMessageReceived': grpc.unary_unary_rpc_method_handler(
264
+ servicer.ConfirmMessageReceived,
265
+ request_deserializer=flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedRequest.FromString,
266
+ response_serializer=flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedResponse.SerializeToString,
267
+ ),
215
268
  }
216
269
  generic_handler = grpc.method_handlers_generic_handler(
217
270
  'flwr.proto.ServerAppIo', rpc_method_handlers)
@@ -222,23 +275,6 @@ def add_ServerAppIoServicer_to_server(servicer, server):
222
275
  class ServerAppIo(object):
223
276
  """Missing associated documentation comment in .proto file."""
224
277
 
225
- @staticmethod
226
- def CreateRun(request,
227
- target,
228
- options=(),
229
- channel_credentials=None,
230
- call_credentials=None,
231
- insecure=False,
232
- compression=None,
233
- wait_for_ready=None,
234
- timeout=None,
235
- metadata=None):
236
- return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/CreateRun',
237
- flwr_dot_proto_dot_run__pb2.CreateRunRequest.SerializeToString,
238
- flwr_dot_proto_dot_run__pb2.CreateRunResponse.FromString,
239
- options, channel_credentials,
240
- insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
241
-
242
278
  @staticmethod
243
279
  def GetNodes(request,
244
280
  target,
@@ -408,3 +444,71 @@ class ServerAppIo(object):
408
444
  flwr_dot_proto_dot_log__pb2.PushLogsResponse.FromString,
409
445
  options, channel_credentials,
410
446
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
447
+
448
+ @staticmethod
449
+ def SendAppHeartbeat(request,
450
+ target,
451
+ options=(),
452
+ channel_credentials=None,
453
+ call_credentials=None,
454
+ insecure=False,
455
+ compression=None,
456
+ wait_for_ready=None,
457
+ timeout=None,
458
+ metadata=None):
459
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/SendAppHeartbeat',
460
+ flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.SerializeToString,
461
+ flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.FromString,
462
+ options, channel_credentials,
463
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
464
+
465
+ @staticmethod
466
+ def PushObject(request,
467
+ target,
468
+ options=(),
469
+ channel_credentials=None,
470
+ call_credentials=None,
471
+ insecure=False,
472
+ compression=None,
473
+ wait_for_ready=None,
474
+ timeout=None,
475
+ metadata=None):
476
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PushObject',
477
+ flwr_dot_proto_dot_message__pb2.PushObjectRequest.SerializeToString,
478
+ flwr_dot_proto_dot_message__pb2.PushObjectResponse.FromString,
479
+ options, channel_credentials,
480
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
481
+
482
+ @staticmethod
483
+ def PullObject(request,
484
+ target,
485
+ options=(),
486
+ channel_credentials=None,
487
+ call_credentials=None,
488
+ insecure=False,
489
+ compression=None,
490
+ wait_for_ready=None,
491
+ timeout=None,
492
+ metadata=None):
493
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/PullObject',
494
+ flwr_dot_proto_dot_message__pb2.PullObjectRequest.SerializeToString,
495
+ flwr_dot_proto_dot_message__pb2.PullObjectResponse.FromString,
496
+ options, channel_credentials,
497
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
498
+
499
+ @staticmethod
500
+ def ConfirmMessageReceived(request,
501
+ target,
502
+ options=(),
503
+ channel_credentials=None,
504
+ call_credentials=None,
505
+ insecure=False,
506
+ compression=None,
507
+ wait_for_ready=None,
508
+ timeout=None,
509
+ metadata=None):
510
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.ServerAppIo/ConfirmMessageReceived',
511
+ flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedRequest.SerializeToString,
512
+ flwr_dot_proto_dot_message__pb2.ConfirmMessageReceivedResponse.FromString,
513
+ options, channel_credentials,
514
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -4,18 +4,15 @@ isort:skip_file
4
4
  """
5
5
  import abc
6
6
  import flwr.proto.fab_pb2
7
+ import flwr.proto.heartbeat_pb2
7
8
  import flwr.proto.log_pb2
9
+ import flwr.proto.message_pb2
8
10
  import flwr.proto.run_pb2
9
11
  import flwr.proto.serverappio_pb2
10
12
  import grpc
11
13
 
12
14
  class ServerAppIoStub:
13
15
  def __init__(self, channel: grpc.Channel) -> None: ...
14
- CreateRun: grpc.UnaryUnaryMultiCallable[
15
- flwr.proto.run_pb2.CreateRunRequest,
16
- flwr.proto.run_pb2.CreateRunResponse]
17
- """Request run_id"""
18
-
19
16
  GetNodes: grpc.UnaryUnaryMultiCallable[
20
17
  flwr.proto.serverappio_pb2.GetNodesRequest,
21
18
  flwr.proto.serverappio_pb2.GetNodesResponse]
@@ -66,16 +63,28 @@ class ServerAppIoStub:
66
63
  flwr.proto.log_pb2.PushLogsResponse]
67
64
  """Push ServerApp logs"""
68
65
 
66
+ SendAppHeartbeat: grpc.UnaryUnaryMultiCallable[
67
+ flwr.proto.heartbeat_pb2.SendAppHeartbeatRequest,
68
+ flwr.proto.heartbeat_pb2.SendAppHeartbeatResponse]
69
+ """Heartbeat"""
69
70
 
70
- class ServerAppIoServicer(metaclass=abc.ABCMeta):
71
- @abc.abstractmethod
72
- def CreateRun(self,
73
- request: flwr.proto.run_pb2.CreateRunRequest,
74
- context: grpc.ServicerContext,
75
- ) -> flwr.proto.run_pb2.CreateRunResponse:
76
- """Request run_id"""
77
- pass
71
+ PushObject: grpc.UnaryUnaryMultiCallable[
72
+ flwr.proto.message_pb2.PushObjectRequest,
73
+ flwr.proto.message_pb2.PushObjectResponse]
74
+ """Push Object"""
75
+
76
+ PullObject: grpc.UnaryUnaryMultiCallable[
77
+ flwr.proto.message_pb2.PullObjectRequest,
78
+ flwr.proto.message_pb2.PullObjectResponse]
79
+ """Pull Object"""
80
+
81
+ ConfirmMessageReceived: grpc.UnaryUnaryMultiCallable[
82
+ flwr.proto.message_pb2.ConfirmMessageReceivedRequest,
83
+ flwr.proto.message_pb2.ConfirmMessageReceivedResponse]
84
+ """Confirm Message Received"""
78
85
 
86
+
87
+ class ServerAppIoServicer(metaclass=abc.ABCMeta):
79
88
  @abc.abstractmethod
80
89
  def GetNodes(self,
81
90
  request: flwr.proto.serverappio_pb2.GetNodesRequest,
@@ -156,5 +165,37 @@ class ServerAppIoServicer(metaclass=abc.ABCMeta):
156
165
  """Push ServerApp logs"""
157
166
  pass
158
167
 
168
+ @abc.abstractmethod
169
+ def SendAppHeartbeat(self,
170
+ request: flwr.proto.heartbeat_pb2.SendAppHeartbeatRequest,
171
+ context: grpc.ServicerContext,
172
+ ) -> flwr.proto.heartbeat_pb2.SendAppHeartbeatResponse:
173
+ """Heartbeat"""
174
+ pass
175
+
176
+ @abc.abstractmethod
177
+ def PushObject(self,
178
+ request: flwr.proto.message_pb2.PushObjectRequest,
179
+ context: grpc.ServicerContext,
180
+ ) -> flwr.proto.message_pb2.PushObjectResponse:
181
+ """Push Object"""
182
+ pass
183
+
184
+ @abc.abstractmethod
185
+ def PullObject(self,
186
+ request: flwr.proto.message_pb2.PullObjectRequest,
187
+ context: grpc.ServicerContext,
188
+ ) -> flwr.proto.message_pb2.PullObjectResponse:
189
+ """Pull Object"""
190
+ pass
191
+
192
+ @abc.abstractmethod
193
+ def ConfirmMessageReceived(self,
194
+ request: flwr.proto.message_pb2.ConfirmMessageReceivedRequest,
195
+ context: grpc.ServicerContext,
196
+ ) -> flwr.proto.message_pb2.ConfirmMessageReceivedResponse:
197
+ """Confirm Message Received"""
198
+ pass
199
+
159
200
 
160
201
  def add_ServerAppIoServicer_to_server(servicer: ServerAppIoServicer, server: grpc.Server) -> None: ...
@@ -12,27 +12,28 @@ 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 log_pb2 as flwr_dot_proto_dot_log__pb2
16
17
  from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
17
18
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
18
19
  from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
19
20
 
20
21
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"\x1d\n\x1bPullSimulationInputsRequest\"\x80\x01\n\x1cPullSimulationInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"T\n\x1cPushSimulationOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1f\n\x1dPushSimulationOutputsResponse2\xd4\x04\n\x0cSimulationIo\x12k\n\x14PullSimulationInputs\x12\'.flwr.proto.PullSimulationInputsRequest\x1a(.flwr.proto.PullSimulationInputsResponse\"\x00\x12n\n\x15PushSimulationOutputs\x12(.flwr.proto.PushSimulationOutputsRequest\x1a).flwr.proto.PushSimulationOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x62\x06proto3')
22
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x66lwr/proto/simulationio.proto\x12\nflwr.proto\x1a\x1a\x66lwr/proto/heartbeat.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"\x1d\n\x1bPullSimulationInputsRequest\"\x80\x01\n\x1cPullSimulationInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"T\n\x1cPushSimulationOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1f\n\x1dPushSimulationOutputsResponse2\xb5\x05\n\x0cSimulationIo\x12k\n\x14PullSimulationInputs\x12\'.flwr.proto.PullSimulationInputsRequest\x1a(.flwr.proto.PullSimulationInputsResponse\"\x00\x12n\n\x15PushSimulationOutputs\x12(.flwr.proto.PushSimulationOutputsRequest\x1a).flwr.proto.PushSimulationOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x12k\n\x14GetFederationOptions\x12\'.flwr.proto.GetFederationOptionsRequest\x1a(.flwr.proto.GetFederationOptionsResponse\"\x00\x12S\n\x0cGetRunStatus\x12\x1f.flwr.proto.GetRunStatusRequest\x1a .flwr.proto.GetRunStatusResponse\"\x00\x12_\n\x10SendAppHeartbeat\x12#.flwr.proto.SendAppHeartbeatRequest\x1a$.flwr.proto.SendAppHeartbeatResponse\"\x00\x62\x06proto3')
22
23
 
23
24
  _globals = globals()
24
25
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
25
26
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.simulationio_pb2', _globals)
26
27
  if _descriptor._USE_C_DESCRIPTORS == False:
27
28
  DESCRIPTOR._options = None
28
- _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_start=137
29
- _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_end=166
30
- _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_start=169
31
- _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_end=297
32
- _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_start=299
33
- _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_end=383
34
- _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_start=385
35
- _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_end=416
36
- _globals['_SIMULATIONIO']._serialized_start=419
37
- _globals['_SIMULATIONIO']._serialized_end=1015
29
+ _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_start=165
30
+ _globals['_PULLSIMULATIONINPUTSREQUEST']._serialized_end=194
31
+ _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_start=197
32
+ _globals['_PULLSIMULATIONINPUTSRESPONSE']._serialized_end=325
33
+ _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_start=327
34
+ _globals['_PUSHSIMULATIONOUTPUTSREQUEST']._serialized_end=411
35
+ _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_start=413
36
+ _globals['_PUSHSIMULATIONOUTPUTSRESPONSE']._serialized_end=444
37
+ _globals['_SIMULATIONIO']._serialized_start=447
38
+ _globals['_SIMULATIONIO']._serialized_end=1140
38
39
  # @@protoc_insertion_point(module_scope)
@@ -2,6 +2,7 @@
2
2
  """Client and server classes corresponding to protobuf-defined services."""
3
3
  import grpc
4
4
 
5
+ from flwr.proto import heartbeat_pb2 as flwr_dot_proto_dot_heartbeat__pb2
5
6
  from flwr.proto import log_pb2 as flwr_dot_proto_dot_log__pb2
6
7
  from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
7
8
  from flwr.proto import simulationio_pb2 as flwr_dot_proto_dot_simulationio__pb2
@@ -46,6 +47,11 @@ class SimulationIoStub(object):
46
47
  request_serializer=flwr_dot_proto_dot_run__pb2.GetRunStatusRequest.SerializeToString,
47
48
  response_deserializer=flwr_dot_proto_dot_run__pb2.GetRunStatusResponse.FromString,
48
49
  )
50
+ self.SendAppHeartbeat = channel.unary_unary(
51
+ '/flwr.proto.SimulationIo/SendAppHeartbeat',
52
+ request_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.SerializeToString,
53
+ response_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.FromString,
54
+ )
49
55
 
50
56
 
51
57
  class SimulationIoServicer(object):
@@ -93,6 +99,13 @@ class SimulationIoServicer(object):
93
99
  context.set_details('Method not implemented!')
94
100
  raise NotImplementedError('Method not implemented!')
95
101
 
102
+ def SendAppHeartbeat(self, request, context):
103
+ """Heartbeat
104
+ """
105
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
106
+ context.set_details('Method not implemented!')
107
+ raise NotImplementedError('Method not implemented!')
108
+
96
109
 
97
110
  def add_SimulationIoServicer_to_server(servicer, server):
98
111
  rpc_method_handlers = {
@@ -126,6 +139,11 @@ def add_SimulationIoServicer_to_server(servicer, server):
126
139
  request_deserializer=flwr_dot_proto_dot_run__pb2.GetRunStatusRequest.FromString,
127
140
  response_serializer=flwr_dot_proto_dot_run__pb2.GetRunStatusResponse.SerializeToString,
128
141
  ),
142
+ 'SendAppHeartbeat': grpc.unary_unary_rpc_method_handler(
143
+ servicer.SendAppHeartbeat,
144
+ request_deserializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.FromString,
145
+ response_serializer=flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.SerializeToString,
146
+ ),
129
147
  }
130
148
  generic_handler = grpc.method_handlers_generic_handler(
131
149
  'flwr.proto.SimulationIo', rpc_method_handlers)
@@ -237,3 +255,20 @@ class SimulationIo(object):
237
255
  flwr_dot_proto_dot_run__pb2.GetRunStatusResponse.FromString,
238
256
  options, channel_credentials,
239
257
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
258
+
259
+ @staticmethod
260
+ def SendAppHeartbeat(request,
261
+ target,
262
+ options=(),
263
+ channel_credentials=None,
264
+ call_credentials=None,
265
+ insecure=False,
266
+ compression=None,
267
+ wait_for_ready=None,
268
+ timeout=None,
269
+ metadata=None):
270
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.SimulationIo/SendAppHeartbeat',
271
+ flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatRequest.SerializeToString,
272
+ flwr_dot_proto_dot_heartbeat__pb2.SendAppHeartbeatResponse.FromString,
273
+ options, channel_credentials,
274
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -3,6 +3,7 @@
3
3
  isort:skip_file
4
4
  """
5
5
  import abc
6
+ import flwr.proto.heartbeat_pb2
6
7
  import flwr.proto.log_pb2
7
8
  import flwr.proto.run_pb2
8
9
  import flwr.proto.simulationio_pb2
@@ -40,6 +41,11 @@ class SimulationIoStub:
40
41
  flwr.proto.run_pb2.GetRunStatusResponse]
41
42
  """Get Run Status"""
42
43
 
44
+ SendAppHeartbeat: grpc.UnaryUnaryMultiCallable[
45
+ flwr.proto.heartbeat_pb2.SendAppHeartbeatRequest,
46
+ flwr.proto.heartbeat_pb2.SendAppHeartbeatResponse]
47
+ """Heartbeat"""
48
+
43
49
 
44
50
  class SimulationIoServicer(metaclass=abc.ABCMeta):
45
51
  @abc.abstractmethod
@@ -90,5 +96,13 @@ class SimulationIoServicer(metaclass=abc.ABCMeta):
90
96
  """Get Run Status"""
91
97
  pass
92
98
 
99
+ @abc.abstractmethod
100
+ def SendAppHeartbeat(self,
101
+ request: flwr.proto.heartbeat_pb2.SendAppHeartbeatRequest,
102
+ context: grpc.ServicerContext,
103
+ ) -> flwr.proto.heartbeat_pb2.SendAppHeartbeatResponse:
104
+ """Heartbeat"""
105
+ pass
106
+
93
107
 
94
108
  def add_SimulationIoServicer_to_server(servicer: SimulationIoServicer, server: grpc.Server) -> None: ...
flwr/server/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2020 Flower Labs GmbH. All Rights Reserved.
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.
@@ -15,9 +15,9 @@
15
15
  """Flower server."""
16
16
 
17
17
 
18
+ from ..compat.server.app import start_server as start_server # Deprecated
18
19
  from . import strategy
19
20
  from . import workflow as workflow
20
- from .app import start_server as start_server
21
21
  from .client_manager import ClientManager as ClientManager
22
22
  from .client_manager import SimpleClientManager as SimpleClientManager
23
23
  from .compat import LegacyContext as LegacyContext