modal 1.1.1.dev4__tar.gz → 1.1.1.dev6__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 modal might be problematic. Click here for more details.

Files changed (188) hide show
  1. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/PKG-INFO +1 -1
  2. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_functions.py +45 -7
  3. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/function_utils.py +13 -2
  4. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/client.pyi +2 -2
  5. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_version/__init__.py +1 -1
  7. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/LICENSE +0 -0
  8. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/README.md +0 -0
  9. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/__init__.py +0 -0
  10. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/__main__.py +0 -0
  11. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_clustered_functions.py +0 -0
  12. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_ipython.py +0 -0
  15. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_location.py +0 -0
  16. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_object.py +0 -0
  17. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_output.py +0 -0
  18. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_partial_function.py +0 -0
  19. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_pty.py +0 -0
  20. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_resolver.py +0 -0
  21. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_resources.py +0 -0
  22. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/__init__.py +0 -0
  23. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/asgi.py +0 -0
  24. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/container_io_manager.py +0 -0
  25. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
  26. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/execution_context.py +0 -0
  27. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/execution_context.pyi +0 -0
  28. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  29. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/telemetry.py +0 -0
  30. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_runtime/user_code_imports.py +0 -0
  31. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_serialization.py +0 -0
  32. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_traceback.py +0 -0
  33. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_tunnel.py +0 -0
  34. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_tunnel.pyi +0 -0
  35. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_type_manager.py +0 -0
  36. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/__init__.py +0 -0
  37. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/app_utils.py +0 -0
  38. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/async_utils.py +0 -0
  39. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/auth_token_manager.py +0 -0
  40. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/git_utils.py +0 -0
  45. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/grpc_testing.py +0 -0
  46. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/grpc_utils.py +0 -0
  47. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/hash_utils.py +0 -0
  48. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/http_utils.py +0 -0
  49. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/jwt_utils.py +0 -0
  50. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/logger.py +0 -0
  51. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/mount_utils.py +0 -0
  52. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/name_utils.py +0 -0
  53. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/package_utils.py +0 -0
  54. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/pattern_utils.py +0 -0
  55. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/rand_pb_testing.py +0 -0
  56. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/shell_utils.py +0 -0
  57. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_utils/time_utils.py +0 -0
  58. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_vendor/__init__.py +0 -0
  59. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  60. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_vendor/cloudpickle.py +0 -0
  61. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_vendor/tblib.py +0 -0
  62. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/_watcher.py +0 -0
  63. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/app.py +0 -0
  64. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/app.pyi +0 -0
  65. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/call_graph.py +0 -0
  66. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/__init__.py +0 -0
  67. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/_download.py +0 -0
  68. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/_traceback.py +0 -0
  69. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/app.py +0 -0
  70. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/cluster.py +0 -0
  71. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/config.py +0 -0
  72. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/container.py +0 -0
  73. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/dict.py +0 -0
  74. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/entry_point.py +0 -0
  75. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/environment.py +0 -0
  76. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/import_refs.py +0 -0
  77. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/launch.py +0 -0
  78. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/network_file_system.py +0 -0
  79. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/profile.py +0 -0
  80. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/programs/__init__.py +0 -0
  81. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/programs/run_jupyter.py +0 -0
  82. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/programs/vscode.py +0 -0
  83. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/queues.py +0 -0
  84. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/run.py +0 -0
  85. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/secret.py +0 -0
  86. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/token.py +0 -0
  87. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/utils.py +0 -0
  88. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cli/volume.py +0 -0
  89. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/client.py +0 -0
  90. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cloud_bucket_mount.py +0 -0
  91. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cloud_bucket_mount.pyi +0 -0
  92. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cls.py +0 -0
  93. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/cls.pyi +0 -0
  94. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/config.py +0 -0
  95. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/container_process.py +0 -0
  96. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/container_process.pyi +0 -0
  97. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/dict.py +0 -0
  98. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/dict.pyi +0 -0
  99. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/environments.py +0 -0
  100. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/environments.pyi +0 -0
  101. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/exception.py +0 -0
  102. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/experimental/__init__.py +0 -0
  103. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/experimental/flash.py +0 -0
  104. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/experimental/flash.pyi +0 -0
  105. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/experimental/ipython.py +0 -0
  106. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/file_io.py +0 -0
  107. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/file_io.pyi +0 -0
  108. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/file_pattern_matcher.py +0 -0
  109. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/functions.py +0 -0
  110. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/functions.pyi +0 -0
  111. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/gpu.py +0 -0
  112. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/image.py +0 -0
  113. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/image.pyi +0 -0
  114. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/io_streams.py +0 -0
  115. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/io_streams.pyi +0 -0
  116. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/mount.py +0 -0
  117. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/mount.pyi +0 -0
  118. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/network_file_system.py +0 -0
  119. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/network_file_system.pyi +0 -0
  120. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/object.py +0 -0
  121. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/object.pyi +0 -0
  122. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/output.py +0 -0
  123. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/parallel_map.py +0 -0
  124. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/parallel_map.pyi +0 -0
  125. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/partial_function.py +0 -0
  126. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/partial_function.pyi +0 -0
  127. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/proxy.py +0 -0
  128. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/proxy.pyi +0 -0
  129. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/py.typed +0 -0
  130. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/queue.py +0 -0
  131. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/queue.pyi +0 -0
  132. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/2023.12.312.txt +0 -0
  133. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/2023.12.txt +0 -0
  134. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/2024.04.txt +0 -0
  135. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/2024.10.txt +0 -0
  136. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/2025.06.txt +0 -0
  137. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/PREVIEW.txt +0 -0
  138. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/README.md +0 -0
  139. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/requirements/base-images.json +0 -0
  140. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/retries.py +0 -0
  141. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/runner.py +0 -0
  142. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/runner.pyi +0 -0
  143. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/running_app.py +0 -0
  144. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/sandbox.py +0 -0
  145. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/sandbox.pyi +0 -0
  146. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/schedule.py +0 -0
  147. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/scheduler_placement.py +0 -0
  148. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/secret.py +0 -0
  149. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/secret.pyi +0 -0
  150. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/serving.py +0 -0
  151. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/serving.pyi +0 -0
  152. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/snapshot.py +0 -0
  153. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/snapshot.pyi +0 -0
  154. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/stream_type.py +0 -0
  155. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/token_flow.py +0 -0
  156. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/token_flow.pyi +0 -0
  157. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/volume.py +0 -0
  158. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal/volume.pyi +0 -0
  159. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/SOURCES.txt +0 -0
  160. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/dependency_links.txt +0 -0
  161. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/entry_points.txt +0 -0
  162. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/requires.txt +0 -0
  163. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal.egg-info/top_level.txt +0 -0
  164. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/__init__.py +0 -0
  165. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/gen_cli_docs.py +0 -0
  166. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/gen_reference_docs.py +0 -0
  167. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/mdmd/__init__.py +0 -0
  168. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/mdmd/mdmd.py +0 -0
  169. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_docs/mdmd/signatures.py +0 -0
  170. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/__init__.py +0 -0
  171. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api.proto +0 -0
  172. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api_grpc.py +0 -0
  173. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api_pb2.py +0 -0
  174. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api_pb2.pyi +0 -0
  175. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api_pb2_grpc.py +0 -0
  176. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/api_pb2_grpc.pyi +0 -0
  177. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/modal_api_grpc.py +0 -0
  178. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/modal_options_grpc.py +0 -0
  179. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options.proto +0 -0
  180. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options_grpc.py +0 -0
  181. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options_pb2.py +0 -0
  182. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options_pb2.pyi +0 -0
  183. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options_pb2_grpc.py +0 -0
  184. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/options_pb2_grpc.pyi +0 -0
  185. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_proto/py.typed +0 -0
  186. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/modal_version/__main__.py +0 -0
  187. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/pyproject.toml +0 -0
  188. {modal-1.1.1.dev4 → modal-1.1.1.dev6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev4
3
+ Version: 1.1.1.dev6
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -451,6 +451,33 @@ class _InputPlaneInvocation:
451
451
  await_response.output.result, await_response.output.data_format, control_plane_stub, self.client
452
452
  )
453
453
 
454
+ async def run_generator(self):
455
+ items_received = 0
456
+ # populated when self.run_function() completes
457
+ items_total: Union[int, None] = None
458
+ async with aclosing(
459
+ async_merge(
460
+ _stream_function_call_data(
461
+ self.client,
462
+ self.stub,
463
+ "",
464
+ variant="data_out",
465
+ attempt_token=self.attempt_token,
466
+ ),
467
+ callable_to_agen(self.run_function),
468
+ )
469
+ ) as streamer:
470
+ async for item in streamer:
471
+ if isinstance(item, api_pb2.GeneratorDone):
472
+ items_total = item.items_total
473
+ else:
474
+ yield item
475
+ items_received += 1
476
+ # The comparison avoids infinite loops if a non-deterministic generator is retried
477
+ # and produces less data in the second run than what was already sent.
478
+ if items_total is not None and items_received >= items_total:
479
+ break
480
+
454
481
  @staticmethod
455
482
  async def _get_metadata(input_plane_region: str, client: _Client) -> list[tuple[str, str]]:
456
483
  if not input_plane_region:
@@ -1544,13 +1571,24 @@ Use the `Function.get_web_url()` method instead.
1544
1571
  @live_method_gen
1545
1572
  @synchronizer.no_input_translation
1546
1573
  async def _call_generator(self, args, kwargs):
1547
- invocation = await _Invocation.create(
1548
- self,
1549
- args,
1550
- kwargs,
1551
- client=self.client,
1552
- function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_SYNC_LEGACY,
1553
- )
1574
+ invocation: Union[_Invocation, _InputPlaneInvocation]
1575
+ if self._input_plane_url:
1576
+ invocation = await _InputPlaneInvocation.create(
1577
+ self,
1578
+ args,
1579
+ kwargs,
1580
+ client=self.client,
1581
+ input_plane_url=self._input_plane_url,
1582
+ input_plane_region=self._input_plane_region,
1583
+ )
1584
+ else:
1585
+ invocation = await _Invocation.create(
1586
+ self,
1587
+ args,
1588
+ kwargs,
1589
+ client=self.client,
1590
+ function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_SYNC_LEGACY,
1591
+ )
1554
1592
  async for res in invocation.run_generator():
1555
1593
  yield res
1556
1594
 
@@ -385,9 +385,16 @@ def callable_has_non_self_non_default_params(f: Callable[..., Any]) -> bool:
385
385
 
386
386
 
387
387
  async def _stream_function_call_data(
388
- client, stub, function_call_id: str, variant: Literal["data_in", "data_out"]
388
+ client,
389
+ stub,
390
+ function_call_id: Optional[str],
391
+ variant: Literal["data_in", "data_out"],
392
+ attempt_token: Optional[str] = None,
389
393
  ) -> AsyncGenerator[Any, None]:
390
394
  """Read from the `data_in` or `data_out` stream of a function call."""
395
+ if function_call_id is None and attempt_token is None:
396
+ raise ValueError("function_call_id or attempt_token is required for data_out stream")
397
+
391
398
  if stub is None:
392
399
  stub = client.stub
393
400
 
@@ -405,7 +412,11 @@ async def _stream_function_call_data(
405
412
  raise ValueError(f"Invalid variant {variant}")
406
413
 
407
414
  while True:
408
- req = api_pb2.FunctionCallGetDataRequest(function_call_id=function_call_id, last_index=last_index)
415
+ req = api_pb2.FunctionCallGetDataRequest(
416
+ function_call_id=function_call_id,
417
+ last_index=last_index,
418
+ attempt_token=attempt_token,
419
+ )
409
420
  try:
410
421
  async for chunk in stub_fn.unary_stream(req):
411
422
  if chunk.index <= last_index:
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.1.dev4",
36
+ version: str = "1.1.1.dev6",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.1.1.dev4",
166
+ version: str = "1.1.1.dev6",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.1.dev4
3
+ Version: 1.1.1.dev6
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.1.dev4"
4
+ __version__ = "1.1.1.dev6"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes