flwr-nightly 1.8.0.dev20240324__tar.gz → 1.8.0.dev20240326__tar.gz

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 (211) hide show
  1. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/PKG-INFO +1 -1
  2. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/pyproject.toml +1 -1
  3. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/client_app.py +4 -4
  4. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/grpc_client/connection.py +2 -1
  5. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/message_handler/message_handler.py +2 -2
  6. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/secure_aggregation/secaggplus_mod.py +1 -1
  7. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/__init__.py +2 -0
  8. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/message.py +19 -13
  9. flwr_nightly-1.8.0.dev20240326/src/py/flwr/proto/fleet_pb2.py +54 -0
  10. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/fleet_pb2.pyi +25 -0
  11. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/fleet_pb2_grpc.py +33 -0
  12. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/fleet_pb2_grpc.pyi +10 -0
  13. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/task_pb2.py +1 -1
  14. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/task_pb2.pyi +2 -2
  15. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/compat/driver_client_proxy.py +2 -1
  16. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/driver/driver.py +6 -5
  17. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py +11 -1
  18. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/message_handler/message_handler.py +10 -0
  19. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/state/in_memory_state.py +3 -7
  20. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/state/sqlite_state.py +5 -9
  21. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/utils/validator.py +12 -6
  22. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/default_workflows.py +4 -4
  23. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/secure_aggregation/secaggplus_workflow.py +5 -4
  24. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/ray_transport/ray_client_proxy.py +2 -2
  25. flwr_nightly-1.8.0.dev20240324/src/py/flwr/proto/fleet_pb2.py +0 -50
  26. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/LICENSE +0 -0
  27. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/README.md +0 -0
  28. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/__init__.py +0 -0
  29. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/__init__.py +0 -0
  30. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/app.py +0 -0
  31. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/example.py +0 -0
  32. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/flower_toml.py +0 -0
  33. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/__init__.py +0 -0
  34. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/new.py +0 -0
  35. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/__init__.py +0 -0
  36. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/README.md.tpl +0 -0
  37. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/__init__.py +0 -0
  38. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/__init__.py +0 -0
  39. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/__init__.py.tpl +0 -0
  40. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/client.numpy.py.tpl +0 -0
  41. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/client.pytorch.py.tpl +0 -0
  42. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/client.tensorflow.py.tpl +0 -0
  43. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/server.numpy.py.tpl +0 -0
  44. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/server.pytorch.py.tpl +0 -0
  45. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/server.tensorflow.py.tpl +0 -0
  46. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/code/task.pytorch.py.tpl +0 -0
  47. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/flower.toml.tpl +0 -0
  48. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/pyproject.numpy.toml.tpl +0 -0
  49. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/pyproject.pytorch.toml.tpl +0 -0
  50. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/pyproject.tensorflow.toml.tpl +0 -0
  51. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/requirements.numpy.txt.tpl +0 -0
  52. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/requirements.pytorch.txt.tpl +0 -0
  53. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/new/templates/app/requirements.tensorflow.txt.tpl +0 -0
  54. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/run/__init__.py +0 -0
  55. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/run/run.py +0 -0
  56. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/cli/utils.py +0 -0
  57. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/__init__.py +0 -0
  58. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/app.py +0 -0
  59. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/client.py +0 -0
  60. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/dpfedavg_numpy_client.py +0 -0
  61. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/grpc_client/__init__.py +0 -0
  62. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/grpc_rere_client/__init__.py +0 -0
  63. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/grpc_rere_client/connection.py +0 -0
  64. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/message_handler/__init__.py +0 -0
  65. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/message_handler/task_handler.py +0 -0
  66. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/__init__.py +0 -0
  67. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/centraldp_mods.py +0 -0
  68. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/comms_mods.py +0 -0
  69. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/localdp_mod.py +0 -0
  70. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/secure_aggregation/__init__.py +0 -0
  71. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/secure_aggregation/secagg_mod.py +0 -0
  72. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/mod/utils.py +0 -0
  73. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/node_state.py +0 -0
  74. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/node_state_tests.py +0 -0
  75. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/numpy_client.py +0 -0
  76. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/rest_client/__init__.py +0 -0
  77. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/rest_client/connection.py +0 -0
  78. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/client/typing.py +0 -0
  79. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/address.py +0 -0
  80. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/constant.py +0 -0
  81. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/context.py +0 -0
  82. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/date.py +0 -0
  83. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/differential_privacy.py +0 -0
  84. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/differential_privacy_constants.py +0 -0
  85. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/dp.py +0 -0
  86. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/exit_handlers.py +0 -0
  87. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/grpc.py +0 -0
  88. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/logger.py +0 -0
  89. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/object_ref.py +0 -0
  90. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/parameter.py +0 -0
  91. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/pyproject.py +0 -0
  92. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/__init__.py +0 -0
  93. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/configsrecord.py +0 -0
  94. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/conversion_utils.py +0 -0
  95. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/metricsrecord.py +0 -0
  96. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/parametersrecord.py +0 -0
  97. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/recordset.py +0 -0
  98. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/record/typeddict.py +0 -0
  99. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/recordset_compat.py +0 -0
  100. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/retry_invoker.py +0 -0
  101. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/__init__.py +0 -0
  102. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/crypto/__init__.py +0 -0
  103. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/crypto/shamir.py +0 -0
  104. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/crypto/symmetric_encryption.py +0 -0
  105. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/ndarrays_arithmetic.py +0 -0
  106. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/quantization.py +0 -0
  107. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/secaggplus_constants.py +0 -0
  108. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/secure_aggregation/secaggplus_utils.py +0 -0
  109. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/serde.py +0 -0
  110. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/telemetry.py +0 -0
  111. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/typing.py +0 -0
  112. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/common/version.py +0 -0
  113. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/__init__.py +0 -0
  114. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/driver_pb2.py +0 -0
  115. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/driver_pb2.pyi +0 -0
  116. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/driver_pb2_grpc.py +0 -0
  117. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/driver_pb2_grpc.pyi +0 -0
  118. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/error_pb2.py +0 -0
  119. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/error_pb2.pyi +0 -0
  120. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/error_pb2_grpc.py +0 -0
  121. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/error_pb2_grpc.pyi +0 -0
  122. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/node_pb2.py +0 -0
  123. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/node_pb2.pyi +0 -0
  124. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/node_pb2_grpc.py +0 -0
  125. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/node_pb2_grpc.pyi +0 -0
  126. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/recordset_pb2.py +0 -0
  127. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/recordset_pb2.pyi +0 -0
  128. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/recordset_pb2_grpc.py +0 -0
  129. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/recordset_pb2_grpc.pyi +0 -0
  130. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/task_pb2_grpc.py +0 -0
  131. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/task_pb2_grpc.pyi +0 -0
  132. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/transport_pb2.py +0 -0
  133. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/transport_pb2.pyi +0 -0
  134. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/transport_pb2_grpc.py +0 -0
  135. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/proto/transport_pb2_grpc.pyi +0 -0
  136. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/py.typed +0 -0
  137. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/__init__.py +0 -0
  138. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/app.py +0 -0
  139. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/client_manager.py +0 -0
  140. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/client_proxy.py +0 -0
  141. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/compat/__init__.py +0 -0
  142. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/compat/app.py +0 -0
  143. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/compat/app_utils.py +0 -0
  144. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/compat/legacy_context.py +0 -0
  145. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/criterion.py +0 -0
  146. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/driver/__init__.py +0 -0
  147. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/driver/grpc_driver.py +0 -0
  148. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/history.py +0 -0
  149. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/run_serverapp.py +0 -0
  150. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/server.py +0 -0
  151. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/server_app.py +0 -0
  152. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/server_config.py +0 -0
  153. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/__init__.py +0 -0
  154. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/aggregate.py +0 -0
  155. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/bulyan.py +0 -0
  156. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/dp_adaptive_clipping.py +0 -0
  157. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/dp_fixed_clipping.py +0 -0
  158. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/dpfedavg_adaptive.py +0 -0
  159. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/dpfedavg_fixed.py +0 -0
  160. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fault_tolerant_fedavg.py +0 -0
  161. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedadagrad.py +0 -0
  162. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedadam.py +0 -0
  163. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedavg.py +0 -0
  164. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedavg_android.py +0 -0
  165. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedavgm.py +0 -0
  166. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedmedian.py +0 -0
  167. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedopt.py +0 -0
  168. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedprox.py +0 -0
  169. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedtrimmedavg.py +0 -0
  170. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedxgb_bagging.py +0 -0
  171. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedxgb_cyclic.py +0 -0
  172. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedxgb_nn_avg.py +0 -0
  173. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/fedyogi.py +0 -0
  174. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/krum.py +0 -0
  175. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/qfedavg.py +0 -0
  176. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/strategy/strategy.py +0 -0
  177. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/__init__.py +0 -0
  178. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/driver/__init__.py +0 -0
  179. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/driver/driver_grpc.py +0 -0
  180. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/driver/driver_servicer.py +0 -0
  181. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/__init__.py +0 -0
  182. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_bidi/__init__.py +0 -0
  183. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_bidi/flower_service_servicer.py +0 -0
  184. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_bridge.py +0 -0
  185. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py +0 -0
  186. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_bidi/grpc_server.py +0 -0
  187. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/grpc_rere/__init__.py +0 -0
  188. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/message_handler/__init__.py +0 -0
  189. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/rest_rere/__init__.py +0 -0
  190. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/rest_rere/rest_api.py +0 -0
  191. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/vce/__init__.py +0 -0
  192. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/vce/backend/__init__.py +0 -0
  193. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/vce/backend/backend.py +0 -0
  194. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/vce/backend/raybackend.py +0 -0
  195. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/fleet/vce/vce_api.py +0 -0
  196. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/state/__init__.py +0 -0
  197. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/state/state.py +0 -0
  198. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/superlink/state/state_factory.py +0 -0
  199. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/typing.py +0 -0
  200. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/utils/__init__.py +0 -0
  201. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/utils/tensorboard.py +0 -0
  202. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/__init__.py +0 -0
  203. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/constant.py +0 -0
  204. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/secure_aggregation/__init__.py +0 -0
  205. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/server/workflow/secure_aggregation/secagg_workflow.py +0 -0
  206. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/__init__.py +0 -0
  207. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/app.py +0 -0
  208. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/ray_transport/__init__.py +0 -0
  209. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/ray_transport/ray_actor.py +0 -0
  210. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/ray_transport/utils.py +0 -0
  211. {flwr_nightly-1.8.0.dev20240324 → flwr_nightly-1.8.0.dev20240326}/src/py/flwr/simulation/run_simulation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flwr-nightly
3
- Version: 1.8.0.dev20240324
3
+ Version: 1.8.0.dev20240326
4
4
  Summary: Flower: A Friendly Federated Learning Framework
5
5
  Home-page: https://flower.ai
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "flwr-nightly"
7
- version = "1.8.0-dev20240324"
7
+ version = "1.8.0-dev20240326"
8
8
  description = "Flower: A Friendly Federated Learning Framework"
9
9
  license = "Apache-2.0"
10
10
  authors = ["The Flower Authors <hello@flower.ai>"]
@@ -115,7 +115,7 @@ class ClientApp:
115
115
  >>> def train(message: Message, context: Context) -> Message:
116
116
  >>> print("ClientApp training running")
117
117
  >>> # Create and return an echo reply message
118
- >>> return message.create_reply(content=message.content(), ttl="")
118
+ >>> return message.create_reply(content=message.content())
119
119
  """
120
120
 
121
121
  def train_decorator(train_fn: ClientAppCallable) -> ClientAppCallable:
@@ -143,7 +143,7 @@ class ClientApp:
143
143
  >>> def evaluate(message: Message, context: Context) -> Message:
144
144
  >>> print("ClientApp evaluation running")
145
145
  >>> # Create and return an echo reply message
146
- >>> return message.create_reply(content=message.content(), ttl="")
146
+ >>> return message.create_reply(content=message.content())
147
147
  """
148
148
 
149
149
  def evaluate_decorator(evaluate_fn: ClientAppCallable) -> ClientAppCallable:
@@ -171,7 +171,7 @@ class ClientApp:
171
171
  >>> def query(message: Message, context: Context) -> Message:
172
172
  >>> print("ClientApp query running")
173
173
  >>> # Create and return an echo reply message
174
- >>> return message.create_reply(content=message.content(), ttl="")
174
+ >>> return message.create_reply(content=message.content())
175
175
  """
176
176
 
177
177
  def query_decorator(query_fn: ClientAppCallable) -> ClientAppCallable:
@@ -218,7 +218,7 @@ def _registration_error(fn_name: str) -> ValueError:
218
218
  >>> print("ClientApp {fn_name} running")
219
219
  >>> # Create and return an echo reply message
220
220
  >>> return message.create_reply(
221
- >>> content=message.content(), ttl=""
221
+ >>> content=message.content()
222
222
  >>> )
223
223
  """,
224
224
  )
@@ -23,6 +23,7 @@ from queue import Queue
23
23
  from typing import Callable, Iterator, Optional, Tuple, Union, cast
24
24
 
25
25
  from flwr.common import (
26
+ DEFAULT_TTL,
26
27
  GRPC_MAX_MESSAGE_LENGTH,
27
28
  ConfigsRecord,
28
29
  Message,
@@ -180,7 +181,7 @@ def grpc_connection( # pylint: disable=R0915
180
181
  dst_node_id=0,
181
182
  reply_to_message="",
182
183
  group_id="",
183
- ttl="",
184
+ ttl=DEFAULT_TTL,
184
185
  message_type=message_type,
185
186
  ),
186
187
  content=recordset,
@@ -81,7 +81,7 @@ def handle_control_message(message: Message) -> Tuple[Optional[Message], int]:
81
81
  reason = cast(int, disconnect_msg.disconnect_res.reason)
82
82
  recordset = RecordSet()
83
83
  recordset.configs_records["config"] = ConfigsRecord({"reason": reason})
84
- out_message = message.create_reply(recordset, ttl="")
84
+ out_message = message.create_reply(recordset)
85
85
  # Return TaskRes and sleep duration
86
86
  return out_message, sleep_duration
87
87
 
@@ -143,7 +143,7 @@ def handle_legacy_message_from_msgtype(
143
143
  raise ValueError(f"Invalid message type: {message_type}")
144
144
 
145
145
  # Return Message
146
- return message.create_reply(out_recordset, ttl="")
146
+ return message.create_reply(out_recordset)
147
147
 
148
148
 
149
149
  def _reconnect(
@@ -187,7 +187,7 @@ def secaggplus_mod(
187
187
 
188
188
  # Return message
189
189
  out_content.configs_records[RECORD_KEY_CONFIGS] = ConfigsRecord(res, False)
190
- return msg.create_reply(out_content, ttl="")
190
+ return msg.create_reply(out_content)
191
191
 
192
192
 
193
193
  def check_stage(current_stage: str, configs: ConfigsRecord) -> None:
@@ -22,6 +22,7 @@ from .date import now as now
22
22
  from .grpc import GRPC_MAX_MESSAGE_LENGTH
23
23
  from .logger import configure as configure
24
24
  from .logger import log as log
25
+ from .message import DEFAULT_TTL
25
26
  from .message import Error as Error
26
27
  from .message import Message as Message
27
28
  from .message import Metadata as Metadata
@@ -87,6 +88,7 @@ __all__ = [
87
88
  "Message",
88
89
  "MessageType",
89
90
  "MessageTypeLegacy",
91
+ "DEFAULT_TTL",
90
92
  "Metadata",
91
93
  "Metrics",
92
94
  "MetricsAggregationFn",
@@ -20,6 +20,8 @@ from dataclasses import dataclass
20
20
 
21
21
  from .record import RecordSet
22
22
 
23
+ DEFAULT_TTL = 3600
24
+
23
25
 
24
26
  @dataclass
25
27
  class Metadata: # pylint: disable=too-many-instance-attributes
@@ -40,8 +42,8 @@ class Metadata: # pylint: disable=too-many-instance-attributes
40
42
  group_id : str
41
43
  An identifier for grouping messages. In some settings,
42
44
  this is used as the FL round.
43
- ttl : str
44
- Time-to-live for this message.
45
+ ttl : float
46
+ Time-to-live for this message in seconds.
45
47
  message_type : str
46
48
  A string that encodes the action to be executed on
47
49
  the receiving end.
@@ -57,7 +59,7 @@ class Metadata: # pylint: disable=too-many-instance-attributes
57
59
  _dst_node_id: int
58
60
  _reply_to_message: str
59
61
  _group_id: str
60
- _ttl: str
62
+ _ttl: float
61
63
  _message_type: str
62
64
  _partition_id: int | None
63
65
 
@@ -69,7 +71,7 @@ class Metadata: # pylint: disable=too-many-instance-attributes
69
71
  dst_node_id: int,
70
72
  reply_to_message: str,
71
73
  group_id: str,
72
- ttl: str,
74
+ ttl: float,
73
75
  message_type: str,
74
76
  partition_id: int | None = None,
75
77
  ) -> None:
@@ -124,12 +126,12 @@ class Metadata: # pylint: disable=too-many-instance-attributes
124
126
  self._group_id = value
125
127
 
126
128
  @property
127
- def ttl(self) -> str:
129
+ def ttl(self) -> float:
128
130
  """Time-to-live for this message."""
129
131
  return self._ttl
130
132
 
131
133
  @ttl.setter
132
- def ttl(self, value: str) -> None:
134
+ def ttl(self, value: float) -> None:
133
135
  """Set ttl."""
134
136
  self._ttl = value
135
137
 
@@ -266,7 +268,7 @@ class Message:
266
268
  """Return True if message has an error, else False."""
267
269
  return self._error is not None
268
270
 
269
- def _create_reply_metadata(self, ttl: str) -> Metadata:
271
+ def _create_reply_metadata(self, ttl: float) -> Metadata:
270
272
  """Construct metadata for a reply message."""
271
273
  return Metadata(
272
274
  run_id=self.metadata.run_id,
@@ -283,7 +285,7 @@ class Message:
283
285
  def create_error_reply(
284
286
  self,
285
287
  error: Error,
286
- ttl: str,
288
+ ttl: float,
287
289
  ) -> Message:
288
290
  """Construct a reply message indicating an error happened.
289
291
 
@@ -291,14 +293,14 @@ class Message:
291
293
  ----------
292
294
  error : Error
293
295
  The error that was encountered.
294
- ttl : str
295
- Time-to-live for this message.
296
+ ttl : float
297
+ Time-to-live for this message in seconds.
296
298
  """
297
299
  # Create reply with error
298
300
  message = Message(metadata=self._create_reply_metadata(ttl), error=error)
299
301
  return message
300
302
 
301
- def create_reply(self, content: RecordSet, ttl: str) -> Message:
303
+ def create_reply(self, content: RecordSet, ttl: float | None = None) -> Message:
302
304
  """Create a reply to this message with specified content and TTL.
303
305
 
304
306
  The method generates a new `Message` as a reply to this message.
@@ -309,14 +311,18 @@ class Message:
309
311
  ----------
310
312
  content : RecordSet
311
313
  The content for the reply message.
312
- ttl : str
313
- Time-to-live for this message.
314
+ ttl : Optional[float] (default: None)
315
+ Time-to-live for this message in seconds. If unset, it will use
316
+ the `common.DEFAULT_TTL` value.
314
317
 
315
318
  Returns
316
319
  -------
317
320
  Message
318
321
  A new `Message` instance representing the reply.
319
322
  """
323
+ if ttl is None:
324
+ ttl = DEFAULT_TTL
325
+
320
326
  return Message(
321
327
  metadata=self._create_reply_metadata(ttl),
322
328
  content=content,
@@ -0,0 +1,54 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: flwr/proto/fleet.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
+ from flwr.proto import task_pb2 as flwr_dot_proto_dot_task__pb2
17
+
18
+
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16\x66lwr/proto/fleet.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x15\x66lwr/proto/task.proto\"\x13\n\x11\x43reateNodeRequest\"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\"-\n\x0bPingRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\"\x1f\n\x0cPingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"F\n\x12PullTaskInsRequest\x12\x1e\n\x04node\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x10\n\x08task_ids\x18\x02 \x03(\t\"k\n\x13PullTaskInsResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12*\n\rtask_ins_list\x18\x02 \x03(\x0b\x32\x13.flwr.proto.TaskIns\"@\n\x12PushTaskResRequest\x12*\n\rtask_res_list\x18\x01 \x03(\x0b\x32\x13.flwr.proto.TaskRes\"\xae\x01\n\x13PushTaskResResponse\x12(\n\treconnect\x18\x01 \x01(\x0b\x32\x15.flwr.proto.Reconnect\x12=\n\x07results\x18\x02 \x03(\x0b\x32,.flwr.proto.PushTaskResResponse.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\x86\x03\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;\n\x04Ping\x12\x17.flwr.proto.PingRequest\x1a\x18.flwr.proto.PingResponse\"\x00\x12P\n\x0bPullTaskIns\x12\x1e.flwr.proto.PullTaskInsRequest\x1a\x1f.flwr.proto.PullTaskInsResponse\"\x00\x12P\n\x0bPushTaskRes\x12\x1e.flwr.proto.PushTaskResRequest\x1a\x1f.flwr.proto.PushTaskResResponse\"\x00\x62\x06proto3')
20
+
21
+ _globals = globals()
22
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
23
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'flwr.proto.fleet_pb2', _globals)
24
+ if _descriptor._USE_C_DESCRIPTORS == False:
25
+ DESCRIPTOR._options = None
26
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._options = None
27
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_options = b'8\001'
28
+ _globals['_CREATENODEREQUEST']._serialized_start=84
29
+ _globals['_CREATENODEREQUEST']._serialized_end=103
30
+ _globals['_CREATENODERESPONSE']._serialized_start=105
31
+ _globals['_CREATENODERESPONSE']._serialized_end=157
32
+ _globals['_DELETENODEREQUEST']._serialized_start=159
33
+ _globals['_DELETENODEREQUEST']._serialized_end=210
34
+ _globals['_DELETENODERESPONSE']._serialized_start=212
35
+ _globals['_DELETENODERESPONSE']._serialized_end=232
36
+ _globals['_PINGREQUEST']._serialized_start=234
37
+ _globals['_PINGREQUEST']._serialized_end=279
38
+ _globals['_PINGRESPONSE']._serialized_start=281
39
+ _globals['_PINGRESPONSE']._serialized_end=312
40
+ _globals['_PULLTASKINSREQUEST']._serialized_start=314
41
+ _globals['_PULLTASKINSREQUEST']._serialized_end=384
42
+ _globals['_PULLTASKINSRESPONSE']._serialized_start=386
43
+ _globals['_PULLTASKINSRESPONSE']._serialized_end=493
44
+ _globals['_PUSHTASKRESREQUEST']._serialized_start=495
45
+ _globals['_PUSHTASKRESREQUEST']._serialized_end=559
46
+ _globals['_PUSHTASKRESRESPONSE']._serialized_start=562
47
+ _globals['_PUSHTASKRESRESPONSE']._serialized_end=736
48
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_start=690
49
+ _globals['_PUSHTASKRESRESPONSE_RESULTSENTRY']._serialized_end=736
50
+ _globals['_RECONNECT']._serialized_start=738
51
+ _globals['_RECONNECT']._serialized_end=768
52
+ _globals['_FLEET']._serialized_start=771
53
+ _globals['_FLEET']._serialized_end=1161
54
+ # @@protoc_insertion_point(module_scope)
@@ -53,6 +53,31 @@ class DeleteNodeResponse(google.protobuf.message.Message):
53
53
  ) -> None: ...
54
54
  global___DeleteNodeResponse = DeleteNodeResponse
55
55
 
56
+ class PingRequest(google.protobuf.message.Message):
57
+ """Ping messages"""
58
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
59
+ NODE_FIELD_NUMBER: builtins.int
60
+ @property
61
+ def node(self) -> flwr.proto.node_pb2.Node: ...
62
+ def __init__(self,
63
+ *,
64
+ node: typing.Optional[flwr.proto.node_pb2.Node] = ...,
65
+ ) -> None: ...
66
+ def HasField(self, field_name: typing_extensions.Literal["node",b"node"]) -> builtins.bool: ...
67
+ def ClearField(self, field_name: typing_extensions.Literal["node",b"node"]) -> None: ...
68
+ global___PingRequest = PingRequest
69
+
70
+ class PingResponse(google.protobuf.message.Message):
71
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
72
+ SUCCESS_FIELD_NUMBER: builtins.int
73
+ success: builtins.bool
74
+ def __init__(self,
75
+ *,
76
+ success: builtins.bool = ...,
77
+ ) -> None: ...
78
+ def ClearField(self, field_name: typing_extensions.Literal["success",b"success"]) -> None: ...
79
+ global___PingResponse = PingResponse
80
+
56
81
  class PullTaskInsRequest(google.protobuf.message.Message):
57
82
  """PullTaskIns messages"""
58
83
  DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -24,6 +24,11 @@ class FleetStub(object):
24
24
  request_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.SerializeToString,
25
25
  response_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.FromString,
26
26
  )
27
+ self.Ping = channel.unary_unary(
28
+ '/flwr.proto.Fleet/Ping',
29
+ request_serializer=flwr_dot_proto_dot_fleet__pb2.PingRequest.SerializeToString,
30
+ response_deserializer=flwr_dot_proto_dot_fleet__pb2.PingResponse.FromString,
31
+ )
27
32
  self.PullTaskIns = channel.unary_unary(
28
33
  '/flwr.proto.Fleet/PullTaskIns',
29
34
  request_serializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsRequest.SerializeToString,
@@ -51,6 +56,12 @@ class FleetServicer(object):
51
56
  context.set_details('Method not implemented!')
52
57
  raise NotImplementedError('Method not implemented!')
53
58
 
59
+ def Ping(self, request, context):
60
+ """Missing associated documentation comment in .proto file."""
61
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
62
+ context.set_details('Method not implemented!')
63
+ raise NotImplementedError('Method not implemented!')
64
+
54
65
  def PullTaskIns(self, request, context):
55
66
  """Retrieve one or more tasks, if possible
56
67
 
@@ -82,6 +93,11 @@ def add_FleetServicer_to_server(servicer, server):
82
93
  request_deserializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeRequest.FromString,
83
94
  response_serializer=flwr_dot_proto_dot_fleet__pb2.DeleteNodeResponse.SerializeToString,
84
95
  ),
96
+ 'Ping': grpc.unary_unary_rpc_method_handler(
97
+ servicer.Ping,
98
+ request_deserializer=flwr_dot_proto_dot_fleet__pb2.PingRequest.FromString,
99
+ response_serializer=flwr_dot_proto_dot_fleet__pb2.PingResponse.SerializeToString,
100
+ ),
85
101
  'PullTaskIns': grpc.unary_unary_rpc_method_handler(
86
102
  servicer.PullTaskIns,
87
103
  request_deserializer=flwr_dot_proto_dot_fleet__pb2.PullTaskInsRequest.FromString,
@@ -136,6 +152,23 @@ class Fleet(object):
136
152
  options, channel_credentials,
137
153
  insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
138
154
 
155
+ @staticmethod
156
+ def Ping(request,
157
+ target,
158
+ options=(),
159
+ channel_credentials=None,
160
+ call_credentials=None,
161
+ insecure=False,
162
+ compression=None,
163
+ wait_for_ready=None,
164
+ timeout=None,
165
+ metadata=None):
166
+ return grpc.experimental.unary_unary(request, target, '/flwr.proto.Fleet/Ping',
167
+ flwr_dot_proto_dot_fleet__pb2.PingRequest.SerializeToString,
168
+ flwr_dot_proto_dot_fleet__pb2.PingResponse.FromString,
169
+ options, channel_credentials,
170
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
171
+
139
172
  @staticmethod
140
173
  def PullTaskIns(request,
141
174
  target,
@@ -16,6 +16,10 @@ class FleetStub:
16
16
  flwr.proto.fleet_pb2.DeleteNodeRequest,
17
17
  flwr.proto.fleet_pb2.DeleteNodeResponse]
18
18
 
19
+ Ping: grpc.UnaryUnaryMultiCallable[
20
+ flwr.proto.fleet_pb2.PingRequest,
21
+ flwr.proto.fleet_pb2.PingResponse]
22
+
19
23
  PullTaskIns: grpc.UnaryUnaryMultiCallable[
20
24
  flwr.proto.fleet_pb2.PullTaskInsRequest,
21
25
  flwr.proto.fleet_pb2.PullTaskInsResponse]
@@ -46,6 +50,12 @@ class FleetServicer(metaclass=abc.ABCMeta):
46
50
  context: grpc.ServicerContext,
47
51
  ) -> flwr.proto.fleet_pb2.DeleteNodeResponse: ...
48
52
 
53
+ @abc.abstractmethod
54
+ def Ping(self,
55
+ request: flwr.proto.fleet_pb2.PingRequest,
56
+ context: grpc.ServicerContext,
57
+ ) -> flwr.proto.fleet_pb2.PingResponse: ...
58
+
49
59
  @abc.abstractmethod
50
60
  def PullTaskIns(self,
51
61
  request: flwr.proto.fleet_pb2.PullTaskInsRequest,
@@ -18,7 +18,7 @@ from flwr.proto import transport_pb2 as flwr_dot_proto_dot_transport__pb2
18
18
  from flwr.proto import error_pb2 as flwr_dot_proto_dot_error__pb2
19
19
 
20
20
 
21
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x16\x66lwr/proto/error.proto\"\xf6\x01\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\t\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x0b\n\x03ttl\x18\x05 \x01(\t\x12\x10\n\x08\x61ncestry\x18\x06 \x03(\t\x12\x11\n\ttask_type\x18\x07 \x01(\t\x12(\n\trecordset\x18\x08 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\t \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
21
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15\x66lwr/proto/task.proto\x12\nflwr.proto\x1a\x15\x66lwr/proto/node.proto\x1a\x1a\x66lwr/proto/recordset.proto\x1a\x1a\x66lwr/proto/transport.proto\x1a\x16\x66lwr/proto/error.proto\"\xf6\x01\n\x04Task\x12\"\n\x08producer\x18\x01 \x01(\x0b\x32\x10.flwr.proto.Node\x12\"\n\x08\x63onsumer\x18\x02 \x01(\x0b\x32\x10.flwr.proto.Node\x12\x12\n\ncreated_at\x18\x03 \x01(\t\x12\x14\n\x0c\x64\x65livered_at\x18\x04 \x01(\t\x12\x0b\n\x03ttl\x18\x05 \x01(\x01\x12\x10\n\x08\x61ncestry\x18\x06 \x03(\t\x12\x11\n\ttask_type\x18\x07 \x01(\t\x12(\n\trecordset\x18\x08 \x01(\x0b\x32\x15.flwr.proto.RecordSet\x12 \n\x05\x65rror\x18\t \x01(\x0b\x32\x11.flwr.proto.Error\"\\\n\x07TaskIns\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Task\"\\\n\x07TaskRes\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x10\n\x08group_id\x18\x02 \x01(\t\x12\x0e\n\x06run_id\x18\x03 \x01(\x12\x12\x1e\n\x04task\x18\x04 \x01(\x0b\x32\x10.flwr.proto.Taskb\x06proto3')
22
22
 
23
23
  _globals = globals()
24
24
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -31,7 +31,7 @@ class Task(google.protobuf.message.Message):
31
31
  def consumer(self) -> flwr.proto.node_pb2.Node: ...
32
32
  created_at: typing.Text
33
33
  delivered_at: typing.Text
34
- ttl: typing.Text
34
+ ttl: builtins.float
35
35
  @property
36
36
  def ancestry(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[typing.Text]: ...
37
37
  task_type: typing.Text
@@ -45,7 +45,7 @@ class Task(google.protobuf.message.Message):
45
45
  consumer: typing.Optional[flwr.proto.node_pb2.Node] = ...,
46
46
  created_at: typing.Text = ...,
47
47
  delivered_at: typing.Text = ...,
48
- ttl: typing.Text = ...,
48
+ ttl: builtins.float = ...,
49
49
  ancestry: typing.Optional[typing.Iterable[typing.Text]] = ...,
50
50
  task_type: typing.Text = ...,
51
51
  recordset: typing.Optional[flwr.proto.recordset_pb2.RecordSet] = ...,
@@ -19,7 +19,7 @@ import time
19
19
  from typing import List, Optional
20
20
 
21
21
  from flwr import common
22
- from flwr.common import MessageType, MessageTypeLegacy, RecordSet
22
+ from flwr.common import DEFAULT_TTL, MessageType, MessageTypeLegacy, RecordSet
23
23
  from flwr.common import recordset_compat as compat
24
24
  from flwr.common import serde
25
25
  from flwr.proto import driver_pb2, node_pb2, task_pb2 # pylint: disable=E0611
@@ -129,6 +129,7 @@ class DriverClientProxy(ClientProxy):
129
129
  ),
130
130
  task_type=task_type,
131
131
  recordset=serde.recordset_to_proto(recordset),
132
+ ttl=DEFAULT_TTL,
132
133
  ),
133
134
  )
134
135
  push_task_ins_req = driver_pb2.PushTaskInsRequest( # pylint: disable=E1101
@@ -18,7 +18,7 @@
18
18
  import time
19
19
  from typing import Iterable, List, Optional, Tuple
20
20
 
21
- from flwr.common import Message, Metadata, RecordSet
21
+ from flwr.common import DEFAULT_TTL, Message, Metadata, RecordSet
22
22
  from flwr.common.serde import message_from_taskres, message_to_taskins
23
23
  from flwr.proto.driver_pb2 import ( # pylint: disable=E0611
24
24
  CreateRunRequest,
@@ -81,6 +81,7 @@ class Driver:
81
81
  and message.metadata.src_node_id == self.node.node_id
82
82
  and message.metadata.message_id == ""
83
83
  and message.metadata.reply_to_message == ""
84
+ and message.metadata.ttl > 0
84
85
  ):
85
86
  raise ValueError(f"Invalid message: {message}")
86
87
 
@@ -90,7 +91,7 @@ class Driver:
90
91
  message_type: str,
91
92
  dst_node_id: int,
92
93
  group_id: str,
93
- ttl: str,
94
+ ttl: float = DEFAULT_TTL,
94
95
  ) -> Message:
95
96
  """Create a new message with specified parameters.
96
97
 
@@ -110,10 +111,10 @@ class Driver:
110
111
  group_id : str
111
112
  The ID of the group to which this message is associated. In some settings,
112
113
  this is used as the FL round.
113
- ttl : str
114
+ ttl : float (default: common.DEFAULT_TTL)
114
115
  Time-to-live for the round trip of this message, i.e., the time from sending
115
- this message to receiving a reply. It specifies the duration for which the
116
- message and its potential reply are considered valid.
116
+ this message to receiving a reply. It specifies in seconds the duration for
117
+ which the message and its potential reply are considered valid.
117
118
 
118
119
  Returns
119
120
  -------
@@ -15,7 +15,7 @@
15
15
  """Fleet API gRPC request-response servicer."""
16
16
 
17
17
 
18
- from logging import INFO
18
+ from logging import DEBUG, INFO
19
19
 
20
20
  import grpc
21
21
 
@@ -26,6 +26,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
26
26
  CreateNodeResponse,
27
27
  DeleteNodeRequest,
28
28
  DeleteNodeResponse,
29
+ PingRequest,
30
+ PingResponse,
29
31
  PullTaskInsRequest,
30
32
  PullTaskInsResponse,
31
33
  PushTaskResRequest,
@@ -61,6 +63,14 @@ class FleetServicer(fleet_pb2_grpc.FleetServicer):
61
63
  state=self.state_factory.state(),
62
64
  )
63
65
 
66
+ def Ping(self, request: PingRequest, context: grpc.ServicerContext) -> PingResponse:
67
+ """."""
68
+ log(DEBUG, "FleetServicer.Ping")
69
+ return message_handler.ping(
70
+ request=request,
71
+ state=self.state_factory.state(),
72
+ )
73
+
64
74
  def PullTaskIns(
65
75
  self, request: PullTaskInsRequest, context: grpc.ServicerContext
66
76
  ) -> PullTaskInsResponse:
@@ -23,6 +23,8 @@ from flwr.proto.fleet_pb2 import ( # pylint: disable=E0611
23
23
  CreateNodeResponse,
24
24
  DeleteNodeRequest,
25
25
  DeleteNodeResponse,
26
+ PingRequest,
27
+ PingResponse,
26
28
  PullTaskInsRequest,
27
29
  PullTaskInsResponse,
28
30
  PushTaskResRequest,
@@ -55,6 +57,14 @@ def delete_node(request: DeleteNodeRequest, state: State) -> DeleteNodeResponse:
55
57
  return DeleteNodeResponse()
56
58
 
57
59
 
60
+ def ping(
61
+ request: PingRequest, # pylint: disable=unused-argument
62
+ state: State, # pylint: disable=unused-argument
63
+ ) -> PingResponse:
64
+ """."""
65
+ return PingResponse(success=True)
66
+
67
+
58
68
  def pull_task_ins(request: PullTaskInsRequest, state: State) -> PullTaskInsResponse:
59
69
  """Pull TaskIns handler."""
60
70
  # Get node_id if client node is not anonymous
@@ -17,7 +17,7 @@
17
17
 
18
18
  import os
19
19
  import threading
20
- from datetime import datetime, timedelta
20
+ from datetime import datetime
21
21
  from logging import ERROR
22
22
  from typing import Dict, List, Optional, Set
23
23
  from uuid import UUID, uuid4
@@ -50,15 +50,13 @@ class InMemoryState(State):
50
50
  log(ERROR, "`run_id` is invalid")
51
51
  return None
52
52
 
53
- # Create task_id, created_at and ttl
53
+ # Create task_id and created_at
54
54
  task_id = uuid4()
55
55
  created_at: datetime = now()
56
- ttl: datetime = created_at + timedelta(hours=24)
57
56
 
58
57
  # Store TaskIns
59
58
  task_ins.task_id = str(task_id)
60
59
  task_ins.task.created_at = created_at.isoformat()
61
- task_ins.task.ttl = ttl.isoformat()
62
60
  with self.lock:
63
61
  self.task_ins_store[task_id] = task_ins
64
62
 
@@ -113,15 +111,13 @@ class InMemoryState(State):
113
111
  log(ERROR, "`run_id` is invalid")
114
112
  return None
115
113
 
116
- # Create task_id, created_at and ttl
114
+ # Create task_id and created_at
117
115
  task_id = uuid4()
118
116
  created_at: datetime = now()
119
- ttl: datetime = created_at + timedelta(hours=24)
120
117
 
121
118
  # Store TaskRes
122
119
  task_res.task_id = str(task_id)
123
120
  task_res.task.created_at = created_at.isoformat()
124
- task_res.task.ttl = ttl.isoformat()
125
121
  with self.lock:
126
122
  self.task_res_store[task_id] = task_res
127
123
 
@@ -18,7 +18,7 @@
18
18
  import os
19
19
  import re
20
20
  import sqlite3
21
- from datetime import datetime, timedelta
21
+ from datetime import datetime
22
22
  from logging import DEBUG, ERROR
23
23
  from typing import Any, Dict, List, Optional, Set, Tuple, Union, cast
24
24
  from uuid import UUID, uuid4
@@ -54,7 +54,7 @@ CREATE TABLE IF NOT EXISTS task_ins(
54
54
  consumer_node_id INTEGER,
55
55
  created_at TEXT,
56
56
  delivered_at TEXT,
57
- ttl TEXT,
57
+ ttl REAL,
58
58
  ancestry TEXT,
59
59
  task_type TEXT,
60
60
  recordset BLOB,
@@ -74,7 +74,7 @@ CREATE TABLE IF NOT EXISTS task_res(
74
74
  consumer_node_id INTEGER,
75
75
  created_at TEXT,
76
76
  delivered_at TEXT,
77
- ttl TEXT,
77
+ ttl REAL,
78
78
  ancestry TEXT,
79
79
  task_type TEXT,
80
80
  recordset BLOB,
@@ -185,15 +185,13 @@ class SqliteState(State):
185
185
  log(ERROR, errors)
186
186
  return None
187
187
 
188
- # Create task_id, created_at and ttl
188
+ # Create task_id and created_at
189
189
  task_id = uuid4()
190
190
  created_at: datetime = now()
191
- ttl: datetime = created_at + timedelta(hours=24)
192
191
 
193
192
  # Store TaskIns
194
193
  task_ins.task_id = str(task_id)
195
194
  task_ins.task.created_at = created_at.isoformat()
196
- task_ins.task.ttl = ttl.isoformat()
197
195
  data = (task_ins_to_dict(task_ins),)
198
196
  columns = ", ".join([f":{key}" for key in data[0]])
199
197
  query = f"INSERT INTO task_ins VALUES({columns});"
@@ -320,15 +318,13 @@ class SqliteState(State):
320
318
  log(ERROR, errors)
321
319
  return None
322
320
 
323
- # Create task_id, created_at and ttl
321
+ # Create task_id and created_at
324
322
  task_id = uuid4()
325
323
  created_at: datetime = now()
326
- ttl: datetime = created_at + timedelta(hours=24)
327
324
 
328
325
  # Store TaskIns
329
326
  task_res.task_id = str(task_id)
330
327
  task_res.task.created_at = created_at.isoformat()
331
- task_res.task.ttl = ttl.isoformat()
332
328
  data = (task_res_to_dict(task_res),)
333
329
  columns = ", ".join([f":{key}" for key in data[0]])
334
330
  query = f"INSERT INTO task_res VALUES({columns});"