flwr-nightly 1.13.0.dev20241019__py3-none-any.whl → 1.13.0.dev20241106__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.

Potentially problematic release.


This version of flwr-nightly might be problematic. Click here for more details.

Files changed (81) hide show
  1. flwr/cli/build.py +2 -2
  2. flwr/cli/config_utils.py +97 -0
  3. flwr/cli/log.py +63 -97
  4. flwr/cli/new/templates/app/code/flwr_tune/dataset.py.tpl +1 -1
  5. flwr/cli/new/templates/app/pyproject.flowertune.toml.tpl +1 -0
  6. flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +1 -1
  7. flwr/cli/run/run.py +18 -83
  8. flwr/client/app.py +13 -14
  9. flwr/client/clientapp/app.py +1 -2
  10. flwr/client/{node_state.py → run_info_store.py} +4 -3
  11. flwr/client/supernode/app.py +6 -8
  12. flwr/common/constant.py +39 -4
  13. flwr/common/context.py +9 -4
  14. flwr/common/date.py +3 -3
  15. flwr/common/logger.py +103 -0
  16. flwr/common/serde.py +24 -0
  17. flwr/common/telemetry.py +0 -6
  18. flwr/common/typing.py +9 -0
  19. flwr/proto/exec_pb2.py +6 -6
  20. flwr/proto/exec_pb2.pyi +8 -2
  21. flwr/proto/log_pb2.py +29 -0
  22. flwr/proto/log_pb2.pyi +39 -0
  23. flwr/proto/log_pb2_grpc.py +4 -0
  24. flwr/proto/log_pb2_grpc.pyi +4 -0
  25. flwr/proto/message_pb2.py +8 -8
  26. flwr/proto/message_pb2.pyi +4 -1
  27. flwr/proto/serverappio_pb2.py +52 -0
  28. flwr/proto/{driver_pb2.pyi → serverappio_pb2.pyi} +54 -0
  29. flwr/proto/serverappio_pb2_grpc.py +376 -0
  30. flwr/proto/serverappio_pb2_grpc.pyi +147 -0
  31. flwr/proto/simulationio_pb2.py +38 -0
  32. flwr/proto/simulationio_pb2.pyi +65 -0
  33. flwr/proto/simulationio_pb2_grpc.py +171 -0
  34. flwr/proto/simulationio_pb2_grpc.pyi +68 -0
  35. flwr/server/app.py +247 -105
  36. flwr/server/driver/driver.py +15 -1
  37. flwr/server/driver/grpc_driver.py +26 -33
  38. flwr/server/driver/inmemory_driver.py +6 -14
  39. flwr/server/run_serverapp.py +29 -23
  40. flwr/server/{superlink/state → serverapp}/__init__.py +3 -9
  41. flwr/server/serverapp/app.py +270 -0
  42. flwr/server/strategy/fedadam.py +11 -1
  43. flwr/server/superlink/driver/__init__.py +1 -1
  44. flwr/server/superlink/driver/{driver_grpc.py → serverappio_grpc.py} +19 -16
  45. flwr/server/superlink/driver/{driver_servicer.py → serverappio_servicer.py} +125 -39
  46. flwr/server/superlink/fleet/grpc_adapter/grpc_adapter_servicer.py +4 -2
  47. flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +2 -2
  48. flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +4 -2
  49. flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +2 -2
  50. flwr/server/superlink/fleet/message_handler/message_handler.py +7 -7
  51. flwr/server/superlink/fleet/rest_rere/rest_api.py +7 -7
  52. flwr/server/superlink/fleet/vce/vce_api.py +23 -23
  53. flwr/server/superlink/linkstate/__init__.py +28 -0
  54. flwr/server/superlink/{state/in_memory_state.py → linkstate/in_memory_linkstate.py} +180 -21
  55. flwr/server/superlink/{state/state.py → linkstate/linkstate.py} +144 -15
  56. flwr/server/superlink/{state/state_factory.py → linkstate/linkstate_factory.py} +9 -9
  57. flwr/server/superlink/{state/sqlite_state.py → linkstate/sqlite_linkstate.py} +300 -50
  58. flwr/server/superlink/{state → linkstate}/utils.py +84 -2
  59. flwr/server/superlink/simulation/__init__.py +15 -0
  60. flwr/server/superlink/simulation/simulationio_grpc.py +65 -0
  61. flwr/server/superlink/simulation/simulationio_servicer.py +132 -0
  62. flwr/simulation/__init__.py +2 -0
  63. flwr/simulation/app.py +1 -1
  64. flwr/simulation/ray_transport/ray_client_proxy.py +2 -2
  65. flwr/simulation/run_simulation.py +57 -131
  66. flwr/simulation/simulationio_connection.py +86 -0
  67. flwr/superexec/app.py +6 -134
  68. flwr/superexec/deployment.py +60 -65
  69. flwr/superexec/exec_grpc.py +15 -8
  70. flwr/superexec/exec_servicer.py +34 -63
  71. flwr/superexec/executor.py +22 -4
  72. flwr/superexec/simulation.py +13 -8
  73. {flwr_nightly-1.13.0.dev20241019.dist-info → flwr_nightly-1.13.0.dev20241106.dist-info}/METADATA +1 -1
  74. {flwr_nightly-1.13.0.dev20241019.dist-info → flwr_nightly-1.13.0.dev20241106.dist-info}/RECORD +77 -64
  75. {flwr_nightly-1.13.0.dev20241019.dist-info → flwr_nightly-1.13.0.dev20241106.dist-info}/entry_points.txt +1 -0
  76. flwr/client/node_state_tests.py +0 -66
  77. flwr/proto/driver_pb2.py +0 -42
  78. flwr/proto/driver_pb2_grpc.py +0 -239
  79. flwr/proto/driver_pb2_grpc.pyi +0 -94
  80. {flwr_nightly-1.13.0.dev20241019.dist-info → flwr_nightly-1.13.0.dev20241106.dist-info}/LICENSE +0 -0
  81. {flwr_nightly-1.13.0.dev20241019.dist-info → flwr_nightly-1.13.0.dev20241106.dist-info}/WHEEL +0 -0
@@ -31,6 +31,8 @@ from flwr.common import EventType, event
31
31
  from flwr.common.config import parse_config_args
32
32
  from flwr.common.constant import (
33
33
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS,
34
+ ISOLATION_MODE_PROCESS,
35
+ ISOLATION_MODE_SUBPROCESS,
34
36
  TRANSPORT_TYPE_GRPC_ADAPTER,
35
37
  TRANSPORT_TYPE_GRPC_RERE,
36
38
  TRANSPORT_TYPE_REST,
@@ -38,11 +40,7 @@ from flwr.common.constant import (
38
40
  from flwr.common.exit_handlers import register_exit_handlers
39
41
  from flwr.common.logger import log, warn_deprecated_feature
40
42
 
41
- from ..app import (
42
- ISOLATION_MODE_PROCESS,
43
- ISOLATION_MODE_SUBPROCESS,
44
- start_client_internal,
45
- )
43
+ from ..app import start_client_internal
46
44
  from ..clientapp.utils import get_load_client_app_fn
47
45
 
48
46
 
@@ -200,10 +198,10 @@ def _parse_args_run_supernode() -> argparse.ArgumentParser:
200
198
  ISOLATION_MODE_SUBPROCESS,
201
199
  ISOLATION_MODE_PROCESS,
202
200
  ],
203
- help="Isolation mode when running `ClientApp` (optional, possible values: "
204
- "`subprocess`, `process`). By default, `ClientApp` runs in the same process "
201
+ help="Isolation mode when running a `ClientApp` (optional, possible values: "
202
+ "`subprocess`, `process`). By default, a `ClientApp` runs in the same process "
205
203
  "that executes the SuperNode. Use `subprocess` to configure SuperNode to run "
206
- "`ClientApp` in a subprocess. Use `process` to indicate that a separate "
204
+ "a `ClientApp` in a subprocess. Use `process` to indicate that a separate "
207
205
  "independent process gets created outside of SuperNode.",
208
206
  )
209
207
  parser.add_argument(
flwr/common/constant.py CHANGED
@@ -40,15 +40,15 @@ TRANSPORT_TYPES = [
40
40
  # Addresses
41
41
  # SuperNode
42
42
  CLIENTAPPIO_API_DEFAULT_ADDRESS = "0.0.0.0:9094"
43
- # SuperExec
44
- EXEC_API_DEFAULT_ADDRESS = "0.0.0.0:9093"
45
43
  # SuperLink
46
- DRIVER_API_DEFAULT_ADDRESS = "0.0.0.0:9091"
44
+ SERVERAPPIO_API_DEFAULT_ADDRESS = "0.0.0.0:9091"
47
45
  FLEET_API_GRPC_RERE_DEFAULT_ADDRESS = "0.0.0.0:9092"
48
46
  FLEET_API_GRPC_BIDI_DEFAULT_ADDRESS = (
49
47
  "[::]:8080" # IPv6 to keep start_server compatible
50
48
  )
51
- FLEET_API_REST_DEFAULT_ADDRESS = "0.0.0.0:9093"
49
+ FLEET_API_REST_DEFAULT_ADDRESS = "0.0.0.0:9095"
50
+ EXEC_API_DEFAULT_ADDRESS = "0.0.0.0:9093"
51
+ SIMULATIONIO_API_DEFAULT_ADDRESS = "0.0.0.0:9096"
52
52
 
53
53
  # Constants for ping
54
54
  PING_DEFAULT_INTERVAL = 30
@@ -84,6 +84,16 @@ GRPC_ADAPTER_METADATA_MESSAGE_QUALNAME_KEY = "grpc-message-qualname"
84
84
  # Message TTL
85
85
  MESSAGE_TTL_TOLERANCE = 1e-1
86
86
 
87
+ # Isolation modes
88
+ ISOLATION_MODE_SUBPROCESS = "subprocess"
89
+ ISOLATION_MODE_PROCESS = "process"
90
+
91
+ # Log streaming configurations
92
+ CONN_REFRESH_PERIOD = 60 # Stream connection refresh period
93
+ CONN_RECONNECT_INTERVAL = 0.5 # Reconnect interval between two stream connections
94
+ LOG_STREAM_INTERVAL = 0.5 # Log stream interval for `ExecServicer.StreamLogs`
95
+ LOG_UPLOAD_INTERVAL = 0.2 # Minimum interval between two log uploads
96
+
87
97
 
88
98
  class MessageType:
89
99
  """Message type."""
@@ -129,3 +139,28 @@ class ErrorCode:
129
139
  def __new__(cls) -> ErrorCode:
130
140
  """Prevent instantiation."""
131
141
  raise TypeError(f"{cls.__name__} cannot be instantiated.")
142
+
143
+
144
+ class Status:
145
+ """Run status."""
146
+
147
+ PENDING = "pending"
148
+ STARTING = "starting"
149
+ RUNNING = "running"
150
+ FINISHED = "finished"
151
+
152
+ def __new__(cls) -> Status:
153
+ """Prevent instantiation."""
154
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
155
+
156
+
157
+ class SubStatus:
158
+ """Run sub-status."""
159
+
160
+ COMPLETED = "completed"
161
+ FAILED = "failed"
162
+ STOPPED = "stopped"
163
+
164
+ def __new__(cls) -> SubStatus:
165
+ """Prevent instantiation."""
166
+ raise TypeError(f"{cls.__name__} cannot be instantiated.")
flwr/common/context.py CHANGED
@@ -27,36 +27,41 @@ class Context:
27
27
 
28
28
  Parameters
29
29
  ----------
30
+ run_id : int
31
+ The ID that identifies the run.
30
32
  node_id : int
31
33
  The ID that identifies the node.
32
34
  node_config : UserConfig
33
35
  A config (key/value mapping) unique to the node and independent of the
34
36
  `run_config`. This config persists across all runs this node participates in.
35
37
  state : RecordSet
36
- Holds records added by the entity in a given run and that will stay local.
38
+ Holds records added by the entity in a given `run_id` and that will stay local.
37
39
  This means that the data it holds will never leave the system it's running from.
38
40
  This can be used as an intermediate storage or scratchpad when
39
41
  executing mods. It can also be used as a memory to access
40
42
  at different points during the lifecycle of this entity (e.g. across
41
43
  multiple rounds)
42
44
  run_config : UserConfig
43
- A config (key/value mapping) held by the entity in a given run and that will
44
- stay local. It can be used at any point during the lifecycle of this entity
45
+ A config (key/value mapping) held by the entity in a given `run_id` and that
46
+ will stay local. It can be used at any point during the lifecycle of this entity
45
47
  (e.g. across multiple rounds)
46
48
  """
47
49
 
50
+ run_id: int
48
51
  node_id: int
49
52
  node_config: UserConfig
50
53
  state: RecordSet
51
54
  run_config: UserConfig
52
55
 
53
- def __init__( # pylint: disable=too-many-arguments
56
+ def __init__( # pylint: disable=too-many-arguments, too-many-positional-arguments
54
57
  self,
58
+ run_id: int,
55
59
  node_id: int,
56
60
  node_config: UserConfig,
57
61
  state: RecordSet,
58
62
  run_config: UserConfig,
59
63
  ) -> None:
64
+ self.run_id = run_id
60
65
  self.node_id = node_id
61
66
  self.node_config = node_config
62
67
  self.state = state
flwr/common/date.py CHANGED
@@ -15,9 +15,9 @@
15
15
  """Flower date utils."""
16
16
 
17
17
 
18
- from datetime import datetime, timezone
18
+ import datetime
19
19
 
20
20
 
21
- def now() -> datetime:
21
+ def now() -> datetime.datetime:
22
22
  """Construct a datetime from time.time() with time zone set to UTC."""
23
- return datetime.now(tz=timezone.utc)
23
+ return datetime.datetime.now(tz=datetime.timezone.utc)
flwr/common/logger.py CHANGED
@@ -16,10 +16,22 @@
16
16
 
17
17
 
18
18
  import logging
19
+ import sys
20
+ import threading
21
+ import time
19
22
  from logging import WARN, LogRecord
20
23
  from logging.handlers import HTTPHandler
24
+ from queue import Empty, Queue
21
25
  from typing import TYPE_CHECKING, Any, Optional, TextIO
22
26
 
27
+ import grpc
28
+
29
+ from flwr.proto.log_pb2 import PushLogsRequest # pylint: disable=E0611
30
+ from flwr.proto.node_pb2 import Node # pylint: disable=E0611
31
+ from flwr.proto.serverappio_pb2_grpc import ServerAppIoStub # pylint: disable=E0611
32
+
33
+ from .constant import LOG_UPLOAD_INTERVAL
34
+
23
35
  # Create logger
24
36
  LOGGER_NAME = "flwr"
25
37
  FLOWER_LOGGER = logging.getLogger(LOGGER_NAME)
@@ -259,3 +271,94 @@ def set_logger_propagation(
259
271
  if not child_logger.propagate:
260
272
  child_logger.log(logging.DEBUG, "Logger propagate set to False")
261
273
  return child_logger
274
+
275
+
276
+ def mirror_output_to_queue(log_queue: Queue[Optional[str]]) -> None:
277
+ """Mirror stdout and stderr output to the provided queue."""
278
+
279
+ def get_write_fn(stream: TextIO) -> Any:
280
+ original_write = stream.write
281
+
282
+ def fn(s: str) -> int:
283
+ ret = original_write(s)
284
+ stream.flush()
285
+ log_queue.put(s)
286
+ return ret
287
+
288
+ return fn
289
+
290
+ sys.stdout.write = get_write_fn(sys.stdout) # type: ignore[method-assign]
291
+ sys.stderr.write = get_write_fn(sys.stderr) # type: ignore[method-assign]
292
+ console_handler.stream = sys.stdout
293
+
294
+
295
+ def restore_output() -> None:
296
+ """Restore stdout and stderr.
297
+
298
+ This will stop mirroring output to queues.
299
+ """
300
+ sys.stdout = sys.__stdout__
301
+ sys.stderr = sys.__stderr__
302
+ console_handler.stream = sys.stdout
303
+
304
+
305
+ def _log_uploader(
306
+ log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: ServerAppIoStub
307
+ ) -> None:
308
+ """Upload logs to the SuperLink."""
309
+ exit_flag = False
310
+ node = Node(node_id=node_id, anonymous=False)
311
+ msgs: list[str] = []
312
+ while True:
313
+ # Fetch all messages from the queue
314
+ try:
315
+ while True:
316
+ msg = log_queue.get_nowait()
317
+ # Quit the loops if the returned message is `None`
318
+ # This is a signal that the run has finished
319
+ if msg is None:
320
+ exit_flag = True
321
+ break
322
+ msgs.append(msg)
323
+ except Empty:
324
+ pass
325
+
326
+ # Upload if any logs
327
+ if msgs:
328
+ req = PushLogsRequest(
329
+ node=node,
330
+ run_id=run_id,
331
+ logs=msgs,
332
+ )
333
+ try:
334
+ stub.PushLogs(req)
335
+ msgs.clear()
336
+ except grpc.RpcError as e:
337
+ # Ignore minor network errors
338
+ # pylint: disable-next=no-member
339
+ if e.code() != grpc.StatusCode.UNAVAILABLE:
340
+ raise e
341
+
342
+ if exit_flag:
343
+ break
344
+
345
+ time.sleep(LOG_UPLOAD_INTERVAL)
346
+
347
+
348
+ def start_log_uploader(
349
+ log_queue: Queue[Optional[str]], node_id: int, run_id: int, stub: ServerAppIoStub
350
+ ) -> threading.Thread:
351
+ """Start the log uploader thread and return it."""
352
+ thread = threading.Thread(
353
+ target=_log_uploader, args=(log_queue, node_id, run_id, stub)
354
+ )
355
+ thread.start()
356
+ return thread
357
+
358
+
359
+ def stop_log_uploader(
360
+ log_queue: Queue[Optional[str]], log_uploader: threading.Thread
361
+ ) -> None:
362
+ """Stop the log uploader thread."""
363
+ log_queue.put(None)
364
+ log_uploader.join()
flwr/common/serde.py CHANGED
@@ -40,6 +40,7 @@ from flwr.proto.recordset_pb2 import ParametersRecord as ProtoParametersRecord
40
40
  from flwr.proto.recordset_pb2 import RecordSet as ProtoRecordSet
41
41
  from flwr.proto.recordset_pb2 import SintList, StringList, UintList
42
42
  from flwr.proto.run_pb2 import Run as ProtoRun
43
+ from flwr.proto.run_pb2 import RunStatus as ProtoRunStatus
43
44
  from flwr.proto.task_pb2 import Task, TaskIns, TaskRes
44
45
  from flwr.proto.transport_pb2 import (
45
46
  ClientMessage,
@@ -839,6 +840,7 @@ def message_from_proto(message_proto: ProtoMessage) -> Message:
839
840
  def context_to_proto(context: Context) -> ProtoContext:
840
841
  """Serialize `Context` to ProtoBuf."""
841
842
  proto = ProtoContext(
843
+ run_id=context.run_id,
842
844
  node_id=context.node_id,
843
845
  node_config=user_config_to_proto(context.node_config),
844
846
  state=recordset_to_proto(context.state),
@@ -850,6 +852,7 @@ def context_to_proto(context: Context) -> ProtoContext:
850
852
  def context_from_proto(context_proto: ProtoContext) -> Context:
851
853
  """Deserialize `Context` from ProtoBuf."""
852
854
  context = Context(
855
+ run_id=context_proto.run_id,
853
856
  node_id=context_proto.node_id,
854
857
  node_config=user_config_from_proto(context_proto.node_config),
855
858
  state=recordset_from_proto(context_proto.state),
@@ -910,3 +913,24 @@ def clientappstatus_from_proto(
910
913
  if msg.code == ClientAppOutputCode.UNKNOWN_ERROR:
911
914
  code = typing.ClientAppOutputCode.UNKNOWN_ERROR
912
915
  return typing.ClientAppOutputStatus(code=code, message=msg.message)
916
+
917
+
918
+ # === Run status ===
919
+
920
+
921
+ def run_status_to_proto(run_status: typing.RunStatus) -> ProtoRunStatus:
922
+ """Serialize `RunStatus` to ProtoBuf."""
923
+ return ProtoRunStatus(
924
+ status=run_status.status,
925
+ sub_status=run_status.sub_status,
926
+ details=run_status.details,
927
+ )
928
+
929
+
930
+ def run_status_from_proto(run_status_proto: ProtoRunStatus) -> typing.RunStatus:
931
+ """Deserialize `RunStatus` from ProtoBuf."""
932
+ return typing.RunStatus(
933
+ status=run_status_proto.status,
934
+ sub_status=run_status_proto.sub_status,
935
+ details=run_status_proto.details,
936
+ )
flwr/common/telemetry.py CHANGED
@@ -150,12 +150,6 @@ class EventType(str, Enum):
150
150
 
151
151
  # Not yet implemented
152
152
 
153
- # --- SuperExec --------------------------------------------------------------------
154
-
155
- # SuperExec
156
- RUN_SUPEREXEC_ENTER = auto()
157
- RUN_SUPEREXEC_LEAVE = auto()
158
-
159
153
  # --- Simulation Engine ------------------------------------------------------------
160
154
 
161
155
  # CLI: flower-simulation
flwr/common/typing.py CHANGED
@@ -218,6 +218,15 @@ class Run:
218
218
  override_config: UserConfig
219
219
 
220
220
 
221
+ @dataclass
222
+ class RunStatus:
223
+ """Run status information."""
224
+
225
+ status: str
226
+ sub_status: str
227
+ details: str
228
+
229
+
221
230
  @dataclass
222
231
  class Fab:
223
232
  """Fab file representation."""
flwr/proto/exec_pb2.py CHANGED
@@ -16,7 +16,7 @@ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
16
16
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"#\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"(\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t2\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/exec.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/fab.proto\x1a\x1a\x66lwr/proto/transport.proto\"\xdf\x02\n\x0fStartRunRequest\x12\x1c\n\x03\x66\x61\x62\x18\x01 \x01(\x0b\x32\x0f.flwr.proto.Fab\x12H\n\x0foverride_config\x18\x02 \x03(\x0b\x32/.flwr.proto.StartRunRequest.OverrideConfigEntry\x12L\n\x11\x66\x65\x64\x65ration_config\x18\x03 \x03(\x0b\x32\x31.flwr.proto.StartRunRequest.FederationConfigEntry\x1aI\n\x13OverrideConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1aK\n\x15\x46\x65\x64\x65rationConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\"\n\x10StartRunResponse\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"<\n\x11StreamLogsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x17\n\x0f\x61\x66ter_timestamp\x18\x02 \x01(\x01\"B\n\x12StreamLogsResponse\x12\x12\n\nlog_output\x18\x01 \x01(\t\x12\x18\n\x10latest_timestamp\x18\x02 \x01(\x01\x32\xa0\x01\n\x04\x45xec\x12G\n\x08StartRun\x12\x1b.flwr.proto.StartRunRequest\x1a\x1c.flwr.proto.StartRunResponse\"\x00\x12O\n\nStreamLogs\x12\x1d.flwr.proto.StreamLogsRequest\x1a\x1e.flwr.proto.StreamLogsResponse\"\x00\x30\x01\x62\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -36,9 +36,9 @@ if _descriptor._USE_C_DESCRIPTORS == False:
36
36
  _globals['_STARTRUNRESPONSE']._serialized_start=441
37
37
  _globals['_STARTRUNRESPONSE']._serialized_end=475
38
38
  _globals['_STREAMLOGSREQUEST']._serialized_start=477
39
- _globals['_STREAMLOGSREQUEST']._serialized_end=512
40
- _globals['_STREAMLOGSRESPONSE']._serialized_start=514
41
- _globals['_STREAMLOGSRESPONSE']._serialized_end=554
42
- _globals['_EXEC']._serialized_start=557
43
- _globals['_EXEC']._serialized_end=717
39
+ _globals['_STREAMLOGSREQUEST']._serialized_end=537
40
+ _globals['_STREAMLOGSRESPONSE']._serialized_start=539
41
+ _globals['_STREAMLOGSRESPONSE']._serialized_end=605
42
+ _globals['_EXEC']._serialized_start=608
43
+ _globals['_EXEC']._serialized_end=768
44
44
  # @@protoc_insertion_point(module_scope)
flwr/proto/exec_pb2.pyi CHANGED
@@ -78,21 +78,27 @@ global___StartRunResponse = StartRunResponse
78
78
  class StreamLogsRequest(google.protobuf.message.Message):
79
79
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
80
80
  RUN_ID_FIELD_NUMBER: builtins.int
81
+ AFTER_TIMESTAMP_FIELD_NUMBER: builtins.int
81
82
  run_id: builtins.int
83
+ after_timestamp: builtins.float
82
84
  def __init__(self,
83
85
  *,
84
86
  run_id: builtins.int = ...,
87
+ after_timestamp: builtins.float = ...,
85
88
  ) -> None: ...
86
- def ClearField(self, field_name: typing_extensions.Literal["run_id",b"run_id"]) -> None: ...
89
+ def ClearField(self, field_name: typing_extensions.Literal["after_timestamp",b"after_timestamp","run_id",b"run_id"]) -> None: ...
87
90
  global___StreamLogsRequest = StreamLogsRequest
88
91
 
89
92
  class StreamLogsResponse(google.protobuf.message.Message):
90
93
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
91
94
  LOG_OUTPUT_FIELD_NUMBER: builtins.int
95
+ LATEST_TIMESTAMP_FIELD_NUMBER: builtins.int
92
96
  log_output: typing.Text
97
+ latest_timestamp: builtins.float
93
98
  def __init__(self,
94
99
  *,
95
100
  log_output: typing.Text = ...,
101
+ latest_timestamp: builtins.float = ...,
96
102
  ) -> None: ...
97
- def ClearField(self, field_name: typing_extensions.Literal["log_output",b"log_output"]) -> None: ...
103
+ def ClearField(self, field_name: typing_extensions.Literal["latest_timestamp",b"latest_timestamp","log_output",b"log_output"]) -> None: ...
98
104
  global___StreamLogsResponse = StreamLogsResponse
flwr/proto/log_pb2.py ADDED
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/log.proto
4
+ # Protobuf Python Version: 4.25.0
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\x14\x66lwr/proto/log.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\"O\n\x0fPushLogsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x0e\n\x06run_id\x18\x02 \x01(\x04\x12\x0c\n\x04logs\x18\x03 \x03(\t\"\x12\n\x10PushLogsResponseb\x06proto3')
19
+
20
+ _globals = globals()
21
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
22
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.log_pb2', _globals)
23
+ if _descriptor._USE_C_DESCRIPTORS == False:
24
+ DESCRIPTOR._options = None
25
+ _globals['_PUSHLOGSREQUEST']._serialized_start=59
26
+ _globals['_PUSHLOGSREQUEST']._serialized_end=138
27
+ _globals['_PUSHLOGSRESPONSE']._serialized_start=140
28
+ _globals['_PUSHLOGSRESPONSE']._serialized_end=158
29
+ # @@protoc_insertion_point(module_scope)
flwr/proto/log_pb2.pyi ADDED
@@ -0,0 +1,39 @@
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.internal.containers
9
+ import google.protobuf.message
10
+ import typing
11
+ import typing_extensions
12
+
13
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
14
+
15
+ class PushLogsRequest(google.protobuf.message.Message):
16
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
17
+ NODE_FIELD_NUMBER: builtins.int
18
+ RUN_ID_FIELD_NUMBER: builtins.int
19
+ LOGS_FIELD_NUMBER: builtins.int
20
+ @property
21
+ def node(self) -> flwr.proto.node_pb2.Node: ...
22
+ run_id: builtins.int
23
+ @property
24
+ def logs(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
25
+ def __init__(self,
26
+ *,
27
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
28
+ run_id: builtins.int = ...,
29
+ logs: typing.Optional[typing.Iterable[typing.Text]] = ...,
30
+ ) -> None: ...
31
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
32
+ def ClearField(self, field_name: typing_extensions.Literal["logs",b"logs","node",b"node","run_id",b"run_id"]) -> None: ...
33
+ global___PushLogsRequest = PushLogsRequest
34
+
35
+ class PushLogsResponse(google.protobuf.message.Message):
36
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
37
+ def __init__(self,
38
+ ) -> None: ...
39
+ global___PushLogsResponse = PushLogsResponse
@@ -0,0 +1,4 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+
@@ -0,0 +1,4 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
flwr/proto/message_pb2.py CHANGED
@@ -17,7 +17,7 @@ from flwr.proto import recordset_pb2 as flwr_dot_proto_dot_recordset__pb2
17
17
  from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
18
 
19
19
 
20
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xbf\x02\n\x07\x43ontext\x12\x0f\n\x07node_id\x18\x01 \x01(\x04\x12\x38\n\x0bnode_config\x18\x02 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12$\n\x05state\x18\x03 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12\x36\n\nrun_config\x18\x04 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbb\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x18\n\x10reply_to_message\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\x62\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18\x66lwr/proto/message.proto\x12\nflwr.proto\x1a\x16\x66lwr/proto/error.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\"{\n\x07Message\x12&\n\x08metadata\x18\x01 \x01(\x0b\x32\x14.flwr.proto.Metadata\x12&\n\x07\x63ontent\x18\x02 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\x03 \x01(\x0b\x32\x11.flwr.proto.Error\"\xcf\x02\n\x07\x43ontext\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x0f\n\x07node_id\x18\x02 \x01(\x04\x12\x38\n\x0bnode_config\x18\x03 \x03(\x0b\x32#.flwr.proto.Context.NodeConfigEntry\x12$\n\x05state\x18\x04 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12\x36\n\nrun_config\x18\x05 \x03(\x0b\x32\".flwr.proto.Context.RunConfigEntry\x1a\x45\n\x0fNodeConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\x1a\x44\n\x0eRunConfigEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12!\n\x05value\x18\x02 \x01(\x0b\x32\x12.flwr.proto.Scalar:\x02\x38\x01\"\xbb\x01\n\x08Metadata\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12\x12\n\nmessage_id\x18\x02 \x01(\t\x12\x13\n\x0bsrc_node_id\x18\x03 \x01(\x04\x12\x13\n\x0b\x64st_node_id\x18\x04 \x01(\x04\x12\x18\n\x10reply_to_message\x18\x05 \x01(\t\x12\x10\n\x08group_id\x18\x06 \x01(\t\x12\x0b\n\x03ttl\x18\x07 \x01(\x01\x12\x14\n\x0cmessage_type\x18\x08 \x01(\t\x12\x12\n\ncreated_at\x18\t \x01(\x01\x62\x06proto3')
21
21
 
22
22
  _globals = globals()
23
23
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -31,11 +31,11 @@ if _descriptor._USE_C_DESCRIPTORS == False:
31
31
  _globals['_MESSAGE']._serialized_start=120
32
32
  _globals['_MESSAGE']._serialized_end=243
33
33
  _globals['_CONTEXT']._serialized_start=246
34
- _globals['_CONTEXT']._serialized_end=565
35
- _globals['_CONTEXT_NODECONFIGENTRY']._serialized_start=426
36
- _globals['_CONTEXT_NODECONFIGENTRY']._serialized_end=495
37
- _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_start=497
38
- _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_end=565
39
- _globals['_METADATA']._serialized_start=568
40
- _globals['_METADATA']._serialized_end=755
34
+ _globals['_CONTEXT']._serialized_end=581
35
+ _globals['_CONTEXT_NODECONFIGENTRY']._serialized_start=442
36
+ _globals['_CONTEXT_NODECONFIGENTRY']._serialized_end=511
37
+ _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_start=513
38
+ _globals['_CONTEXT_RUNCONFIGENTRY']._serialized_end=581
39
+ _globals['_METADATA']._serialized_start=584
40
+ _globals['_METADATA']._serialized_end=771
41
41
  # @@protoc_insertion_point(module_scope)
@@ -67,10 +67,12 @@ class Context(google.protobuf.message.Message):
67
67
  def HasField(self, field_name: typing_extensions.Literal["value",b"value"]) -> builtins.bool: ...
68
68
  def ClearField(self, field_name: typing_extensions.Literal["key",b"key","value",b"value"]) -> None: ...
69
69
 
70
+ RUN_ID_FIELD_NUMBER: builtins.int
70
71
  NODE_ID_FIELD_NUMBER: builtins.int
71
72
  NODE_CONFIG_FIELD_NUMBER: builtins.int
72
73
  STATE_FIELD_NUMBER: builtins.int
73
74
  RUN_CONFIG_FIELD_NUMBER: builtins.int
75
+ run_id: builtins.int
74
76
  node_id: builtins.int
75
77
  @property
76
78
  def node_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
@@ -80,13 +82,14 @@ class Context(google.protobuf.message.Message):
80
82
  def run_config(self) -> google.protobuf.internal.containers.MessageMap[typing.Text, flwr.proto.transport_pb2.Scalar]: ...
81
83
  def __init__(self,
82
84
  *,
85
+ run_id: builtins.int = ...,
83
86
  node_id: builtins.int = ...,
84
87
  node_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
85
88
  state: typing.Optional[flwr.proto.recordset_pb2.RecordSet] = ...,
86
89
  run_config: typing.Optional[typing.Mapping[typing.Text, flwr.proto.transport_pb2.Scalar]] = ...,
87
90
  ) -> None: ...
88
91
  def HasField(self, field_name: typing_extensions.Literal["state",b"state"]) -> builtins.bool: ...
89
- def ClearField(self, field_name: typing_extensions.Literal["node_config",b"node_config","node_id",b"node_id","run_config",b"run_config","state",b"state"]) -> None: ...
92
+ def ClearField(self, field_name: typing_extensions.Literal["node_config",b"node_config","node_id",b"node_id","run_config",b"run_config","run_id",b"run_id","state",b"state"]) -> None: ...
90
93
  global___Context = Context
91
94
 
92
95
  class Metadata(google.protobuf.message.Message):
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/serverappio.proto
4
+ # Protobuf Python Version: 4.25.0
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 log_pb2 as flwr_dot_proto_dot_log__pb2
16
+ from flwr.proto import node_pb2 as flwr_dot_proto_dot_node__pb2
17
+ from flwr.proto import message_pb2 as flwr_dot_proto_dot_message__pb2
18
+ from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
19
+ from flwr.proto import run_pb2 as flwr_dot_proto_dot_run__pb2
20
+ from flwr.proto import fab_pb2 as flwr_dot_proto_dot_fab__pb2
21
+
22
+
23
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1c\x66lwr/proto/serverappio.proto\x12\nflwr.proto\x1a\x14\x66lwr/proto/log.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x18\x66lwr/proto/message.proto\x1a\x15\x66lwr/proto/task.proto\x1a\x14\x66lwr/proto/run.proto\x1a\x14\x66lwr/proto/fab.proto\"!\n\x0fGetNodesRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\"3\n\x10GetNodesResponse\x12\x1f\n\x05nodes\x18\x01 \x03(\x0b\x32\x10.flwr.proto.Node\"@\n\x12PushTaskInsRequest\x12*\n\rtask_ins_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"\'\n\x13PushTaskInsResponse\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"F\n\x12PullTaskResRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"A\n\x13PullTaskResResponse\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\x1c\n\x1aPullServerAppInputsRequest\"\x7f\n\x1bPullServerAppInputsResponse\x12$\n\x07\x63ontext\x18\x01 \x01(\x0b\x32\x13.flwr.proto.Context\x12\x1c\n\x03run\x18\x02 \x01(\x0b\x32\x0f.flwr.proto.Run\x12\x1c\n\x03\x66\x61\x62\x18\x03 \x01(\x0b\x32\x0f.flwr.proto.Fab\"S\n\x1bPushServerAppOutputsRequest\x12\x0e\n\x06run_id\x18\x01 \x01(\x04\x12$\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x13.flwr.proto.Context\"\x1e\n\x1cPushServerAppOutputsResponse2\xca\x06\n\x0bServerAppIo\x12J\n\tCreateRun\x12\x1c.flwr.proto.CreateRunRequest\x1a\x1d.flwr.proto.CreateRunResponse\"\x00\x12G\n\x08GetNodes\x12\x1b.flwr.proto.GetNodesRequest\x1a\x1c.flwr.proto.GetNodesResponse\"\x00\x12P\n\x0bPushTaskIns\x12\x1e.flwr.proto.PushTaskInsRequest\x1a\x1f.flwr.proto.PushTaskInsResponse\"\x00\x12P\n\x0bPullTaskRes\x12\x1e.flwr.proto.PullTaskResRequest\x1a\x1f.flwr.proto.PullTaskResResponse\"\x00\x12\x41\n\x06GetRun\x12\x19.flwr.proto.GetRunRequest\x1a\x1a.flwr.proto.GetRunResponse\"\x00\x12\x41\n\x06GetFab\x12\x19.flwr.proto.GetFabRequest\x1a\x1a.flwr.proto.GetFabResponse\"\x00\x12h\n\x13PullServerAppInputs\x12&.flwr.proto.PullServerAppInputsRequest\x1a\'.flwr.proto.PullServerAppInputsResponse\"\x00\x12k\n\x14PushServerAppOutputs\x12\'.flwr.proto.PushServerAppOutputsRequest\x1a(.flwr.proto.PushServerAppOutputsResponse\"\x00\x12\\\n\x0fUpdateRunStatus\x12\".flwr.proto.UpdateRunStatusRequest\x1a#.flwr.proto.UpdateRunStatusResponse\"\x00\x12G\n\x08PushLogs\x12\x1b.flwr.proto.PushLogsRequest\x1a\x1c.flwr.proto.PushLogsResponse\"\x00\x62\x06proto3')
24
+
25
+ _globals = globals()
26
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
27
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.serverappio_pb2', _globals)
28
+ if _descriptor._USE_C_DESCRIPTORS == False:
29
+ DESCRIPTOR._options = None
30
+ _globals['_GETNODESREQUEST']._serialized_start=182
31
+ _globals['_GETNODESREQUEST']._serialized_end=215
32
+ _globals['_GETNODESRESPONSE']._serialized_start=217
33
+ _globals['_GETNODESRESPONSE']._serialized_end=268
34
+ _globals['_PUSHTASKINSREQUEST']._serialized_start=270
35
+ _globals['_PUSHTASKINSREQUEST']._serialized_end=334
36
+ _globals['_PUSHTASKINSRESPONSE']._serialized_start=336
37
+ _globals['_PUSHTASKINSRESPONSE']._serialized_end=375
38
+ _globals['_PULLTASKRESREQUEST']._serialized_start=377
39
+ _globals['_PULLTASKRESREQUEST']._serialized_end=447
40
+ _globals['_PULLTASKRESRESPONSE']._serialized_start=449
41
+ _globals['_PULLTASKRESRESPONSE']._serialized_end=514
42
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_start=516
43
+ _globals['_PULLSERVERAPPINPUTSREQUEST']._serialized_end=544
44
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_start=546
45
+ _globals['_PULLSERVERAPPINPUTSRESPONSE']._serialized_end=673
46
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_start=675
47
+ _globals['_PUSHSERVERAPPOUTPUTSREQUEST']._serialized_end=758
48
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_start=760
49
+ _globals['_PUSHSERVERAPPOUTPUTSRESPONSE']._serialized_end=790
50
+ _globals['_SERVERAPPIO']._serialized_start=793
51
+ _globals['_SERVERAPPIO']._serialized_end=1635
52
+ # @@protoc_insertion_point(module_scope)