modal 1.0.0.dev13__tar.gz → 1.0.0.dev15__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.
Files changed (183) hide show
  1. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/PKG-INFO +1 -1
  2. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_functions.py +3 -35
  3. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/client.pyi +2 -2
  4. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/functions.pyi +2 -22
  5. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api.proto +19 -0
  7. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api_grpc.py +32 -0
  8. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api_pb2.py +135 -103
  9. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api_pb2.pyi +60 -0
  10. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api_pb2_grpc.py +66 -0
  11. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/api_pb2_grpc.pyi +20 -0
  12. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/modal_api_grpc.py +2 -0
  13. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_version/__init__.py +1 -1
  14. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/LICENSE +0 -0
  15. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/README.md +0 -0
  16. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/__init__.py +0 -0
  17. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/__main__.py +0 -0
  18. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_clustered_functions.py +0 -0
  19. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_clustered_functions.pyi +0 -0
  20. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_container_entrypoint.py +0 -0
  21. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_ipython.py +0 -0
  22. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_location.py +0 -0
  23. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_object.py +0 -0
  24. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_output.py +0 -0
  25. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_partial_function.py +0 -0
  26. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_pty.py +0 -0
  27. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_resolver.py +0 -0
  28. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_resources.py +0 -0
  29. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/__init__.py +0 -0
  30. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/asgi.py +0 -0
  31. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/container_io_manager.py +0 -0
  32. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/container_io_manager.pyi +0 -0
  33. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/execution_context.py +0 -0
  34. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/execution_context.pyi +0 -0
  35. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  36. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/telemetry.py +0 -0
  37. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_runtime/user_code_imports.py +0 -0
  38. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_serialization.py +0 -0
  39. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_traceback.py +0 -0
  40. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_tunnel.py +0 -0
  41. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_tunnel.pyi +0 -0
  42. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_type_manager.py +0 -0
  43. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/__init__.py +0 -0
  44. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/app_utils.py +0 -0
  45. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/async_utils.py +0 -0
  46. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/blob_utils.py +0 -0
  47. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/bytes_io_segment_payload.py +0 -0
  48. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/deprecation.py +0 -0
  49. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/docker_utils.py +0 -0
  50. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/function_utils.py +0 -0
  51. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/git_utils.py +0 -0
  52. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/grpc_testing.py +0 -0
  53. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/grpc_utils.py +0 -0
  54. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/hash_utils.py +0 -0
  55. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/http_utils.py +0 -0
  56. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/jwt_utils.py +0 -0
  57. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/logger.py +0 -0
  58. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/mount_utils.py +0 -0
  59. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/name_utils.py +0 -0
  60. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/package_utils.py +0 -0
  61. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/pattern_utils.py +0 -0
  62. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/rand_pb_testing.py +0 -0
  63. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_utils/shell_utils.py +0 -0
  64. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_vendor/__init__.py +0 -0
  65. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_vendor/tblib.py +0 -0
  68. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/_watcher.py +0 -0
  69. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/app.py +0 -0
  70. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/app.pyi +0 -0
  71. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/call_graph.py +0 -0
  72. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/__init__.py +0 -0
  73. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/_download.py +0 -0
  74. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/_traceback.py +0 -0
  75. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/app.py +0 -0
  76. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/cluster.py +0 -0
  77. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/config.py +0 -0
  78. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/container.py +0 -0
  79. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/dict.py +0 -0
  80. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/entry_point.py +0 -0
  81. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/environment.py +0 -0
  82. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/import_refs.py +0 -0
  83. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/launch.py +0 -0
  84. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/network_file_system.py +0 -0
  85. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/profile.py +0 -0
  86. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/programs/__init__.py +0 -0
  87. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/programs/run_jupyter.py +0 -0
  88. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/programs/vscode.py +0 -0
  89. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/queues.py +0 -0
  90. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/run.py +0 -0
  91. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/secret.py +0 -0
  92. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/token.py +0 -0
  93. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/utils.py +0 -0
  94. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cli/volume.py +0 -0
  95. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/client.py +0 -0
  96. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cloud_bucket_mount.py +0 -0
  97. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cloud_bucket_mount.pyi +0 -0
  98. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cls.py +0 -0
  99. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/cls.pyi +0 -0
  100. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/config.py +0 -0
  101. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/container_process.py +0 -0
  102. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/container_process.pyi +0 -0
  103. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/dict.py +0 -0
  104. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/dict.pyi +0 -0
  105. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/environments.py +0 -0
  106. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/environments.pyi +0 -0
  107. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/exception.py +0 -0
  108. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/experimental/__init__.py +0 -0
  109. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/experimental/ipython.py +0 -0
  110. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/file_io.py +0 -0
  111. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/file_io.pyi +0 -0
  112. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/file_pattern_matcher.py +0 -0
  113. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/functions.py +0 -0
  114. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/gpu.py +0 -0
  115. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/image.py +0 -0
  116. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/image.pyi +0 -0
  117. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/io_streams.py +0 -0
  118. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/io_streams.pyi +0 -0
  119. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/mount.py +0 -0
  120. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/mount.pyi +0 -0
  121. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/network_file_system.py +0 -0
  122. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/network_file_system.pyi +0 -0
  123. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/object.py +0 -0
  124. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/object.pyi +0 -0
  125. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/output.py +0 -0
  126. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/parallel_map.py +0 -0
  127. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/parallel_map.pyi +0 -0
  128. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/partial_function.py +0 -0
  129. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/partial_function.pyi +0 -0
  130. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/proxy.py +0 -0
  131. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/proxy.pyi +0 -0
  132. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/py.typed +0 -0
  133. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/queue.py +0 -0
  134. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/queue.pyi +0 -0
  135. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/2023.12.312.txt +0 -0
  136. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/2023.12.txt +0 -0
  137. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/2024.04.txt +0 -0
  138. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/2024.10.txt +0 -0
  139. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/PREVIEW.txt +0 -0
  140. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/README.md +0 -0
  141. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/requirements/base-images.json +0 -0
  142. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/retries.py +0 -0
  143. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/runner.py +0 -0
  144. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/runner.pyi +0 -0
  145. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/running_app.py +0 -0
  146. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/sandbox.py +0 -0
  147. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/sandbox.pyi +0 -0
  148. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/schedule.py +0 -0
  149. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/scheduler_placement.py +0 -0
  150. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/secret.py +0 -0
  151. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/secret.pyi +0 -0
  152. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/serving.py +0 -0
  153. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/serving.pyi +0 -0
  154. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/snapshot.py +0 -0
  155. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/snapshot.pyi +0 -0
  156. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/stream_type.py +0 -0
  157. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/token_flow.py +0 -0
  158. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/token_flow.pyi +0 -0
  159. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/volume.py +0 -0
  160. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal/volume.pyi +0 -0
  161. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/__init__.py +0 -0
  167. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/__init__.py +0 -0
  173. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/modal_options_grpc.py +0 -0
  174. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options.proto +0 -0
  175. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options_grpc.py +0 -0
  176. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options_pb2.py +0 -0
  177. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options_pb2.pyi +0 -0
  178. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options_pb2_grpc.py +0 -0
  179. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/options_pb2_grpc.pyi +0 -0
  180. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_proto/py.typed +0 -0
  181. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/modal_version/__main__.py +0 -0
  182. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/pyproject.toml +0 -0
  183. {modal-1.0.0.dev13 → modal-1.0.0.dev15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.0.dev13
3
+ Version: 1.0.0.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1508,20 +1508,6 @@ Use the `Function.get_web_url()` method instead.
1508
1508
  async for res in invocation.run_generator():
1509
1509
  yield res
1510
1510
 
1511
- @synchronizer.no_io_translation
1512
- async def _call_generator_nowait(self, args, kwargs):
1513
- deprecation_warning(
1514
- (2024, 12, 11),
1515
- "Calling spawn on a generator function is deprecated and will soon raise an exception.",
1516
- )
1517
- return await _Invocation.create(
1518
- self,
1519
- args,
1520
- kwargs,
1521
- client=self.client,
1522
- function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_ASYNC,
1523
- )
1524
-
1525
1511
  @synchronizer.no_io_translation
1526
1512
  @live_method
1527
1513
  async def remote(self, *args: P.args, **kwargs: P.kwargs) -> ReturnType:
@@ -1634,7 +1620,7 @@ Use the `Function.get_web_url()` method instead.
1634
1620
  """
1635
1621
  self._check_no_web_url("_experimental_spawn")
1636
1622
  if self._is_generator:
1637
- invocation = await self._call_generator_nowait(args, kwargs)
1623
+ raise InvalidError("Cannot `spawn` a generator function.")
1638
1624
  else:
1639
1625
  invocation = await self._call_function_nowait(
1640
1626
  args, kwargs, function_call_invocation_type=api_pb2.FUNCTION_CALL_INVOCATION_TYPE_ASYNC
@@ -1666,14 +1652,13 @@ Use the `Function.get_web_url()` method instead.
1666
1652
  """
1667
1653
  self._check_no_web_url("spawn")
1668
1654
  if self._is_generator:
1669
- invocation = await self._call_generator_nowait(args, kwargs)
1655
+ raise InvalidError("Cannot `spawn` a generator function.")
1670
1656
  else:
1671
1657
  invocation = await self._call_function_nowait(args, kwargs, api_pb2.FUNCTION_CALL_INVOCATION_TYPE_ASYNC)
1672
1658
 
1673
1659
  fc: _FunctionCall[ReturnType] = _FunctionCall._new_hydrated(
1674
1660
  invocation.function_call_id, invocation.client, None
1675
1661
  )
1676
- fc._is_generator = self._is_generator if self._is_generator else False
1677
1662
  return fc
1678
1663
 
1679
1664
  def get_raw_f(self) -> Callable[..., Any]:
@@ -1732,22 +1717,8 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
1732
1717
 
1733
1718
  The returned coroutine is not cancellation-safe.
1734
1719
  """
1735
-
1736
- if self._is_generator:
1737
- raise Exception("Cannot get the result of a generator function call. Use `get_gen` instead.")
1738
-
1739
1720
  return await self._invocation().poll_function(timeout=timeout)
1740
1721
 
1741
- async def get_gen(self) -> AsyncGenerator[Any, None]:
1742
- """
1743
- Calls the generator remotely, executing it with the given arguments and returning the execution's result.
1744
- """
1745
- if not self._is_generator:
1746
- raise Exception("Cannot iterate over a non-generator function call. Use `get` instead.")
1747
-
1748
- async for res in self._invocation().run_generator():
1749
- yield res
1750
-
1751
1722
  async def get_call_graph(self) -> list[InputInfo]:
1752
1723
  """Returns a structure representing the call graph from a given root
1753
1724
  call ID, along with the status of execution for each node.
@@ -1778,9 +1749,7 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
1778
1749
  await retry_transient_errors(self._client.stub.FunctionCallCancel, request)
1779
1750
 
1780
1751
  @staticmethod
1781
- async def from_id(
1782
- function_call_id: str, client: Optional[_Client] = None, is_generator: bool = False
1783
- ) -> "_FunctionCall[Any]":
1752
+ async def from_id(function_call_id: str, client: Optional[_Client] = None) -> "_FunctionCall[Any]":
1784
1753
  """Instantiate a FunctionCall object from an existing ID.
1785
1754
 
1786
1755
  Examples:
@@ -1803,7 +1772,6 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
1803
1772
  client = await _Client.from_env()
1804
1773
 
1805
1774
  fc: _FunctionCall[Any] = _FunctionCall._new_hydrated(function_call_id, client, None)
1806
- fc._is_generator = is_generator
1807
1775
  return fc
1808
1776
 
1809
1777
  @staticmethod
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "1.0.0.dev13",
34
+ version: str = "1.0.0.dev15",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -94,7 +94,7 @@ class Client:
94
94
  server_url: str,
95
95
  client_type: int,
96
96
  credentials: typing.Optional[tuple[str, str]],
97
- version: str = "1.0.0.dev13",
97
+ version: str = "1.0.0.dev15",
98
98
  ): ...
99
99
  def is_closed(self) -> bool: ...
100
100
  @property
@@ -228,12 +228,6 @@ class Function(
228
228
 
229
229
  _call_generator: ___call_generator_spec[typing_extensions.Self]
230
230
 
231
- class ___call_generator_nowait_spec(typing_extensions.Protocol[SUPERSELF]):
232
- def __call__(self, /, args, kwargs): ...
233
- async def aio(self, /, args, kwargs): ...
234
-
235
- _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
236
-
237
231
  class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
238
232
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
239
233
  async def aio(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
@@ -350,12 +344,6 @@ class FunctionCall(typing.Generic[modal._functions.ReturnType], modal.object.Obj
350
344
 
351
345
  get: __get_spec[modal._functions.ReturnType, typing_extensions.Self]
352
346
 
353
- class __get_gen_spec(typing_extensions.Protocol[SUPERSELF]):
354
- def __call__(self, /) -> typing.Generator[typing.Any, None, None]: ...
355
- def aio(self, /) -> collections.abc.AsyncGenerator[typing.Any, None]: ...
356
-
357
- get_gen: __get_gen_spec[typing_extensions.Self]
358
-
359
347
  class __get_call_graph_spec(typing_extensions.Protocol[SUPERSELF]):
360
348
  def __call__(self, /) -> list[modal.call_graph.InputInfo]: ...
361
349
  async def aio(self, /) -> list[modal.call_graph.InputInfo]: ...
@@ -370,18 +358,10 @@ class FunctionCall(typing.Generic[modal._functions.ReturnType], modal.object.Obj
370
358
 
371
359
  class __from_id_spec(typing_extensions.Protocol):
372
360
  def __call__(
373
- self,
374
- /,
375
- function_call_id: str,
376
- client: typing.Optional[modal.client.Client] = None,
377
- is_generator: bool = False,
361
+ self, /, function_call_id: str, client: typing.Optional[modal.client.Client] = None
378
362
  ) -> FunctionCall[typing.Any]: ...
379
363
  async def aio(
380
- self,
381
- /,
382
- function_call_id: str,
383
- client: typing.Optional[modal.client.Client] = None,
384
- is_generator: bool = False,
364
+ self, /, function_call_id: str, client: typing.Optional[modal.client.Client] = None
385
365
  ) -> FunctionCall[typing.Any]: ...
386
366
 
387
367
  from_id: __from_id_spec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.0.dev13
3
+ Version: 1.0.0.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -2972,6 +2972,17 @@ message VolumeHeartbeatRequest {
2972
2972
  string volume_id = 1;
2973
2973
  }
2974
2974
 
2975
+ message VolumeListFiles2Request {
2976
+ string volume_id = 1;
2977
+ string path = 2;
2978
+ bool recursive = 4;
2979
+ optional uint32 max_entries = 3;
2980
+ }
2981
+
2982
+ message VolumeListFiles2Response {
2983
+ repeated FileEntry entries = 1;
2984
+ }
2985
+
2975
2986
  message VolumeListFilesRequest {
2976
2987
  string volume_id = 1;
2977
2988
  string path = 2;
@@ -3090,6 +3101,12 @@ message VolumeReloadRequest {
3090
3101
  string volume_id = 1;
3091
3102
  }
3092
3103
 
3104
+ message VolumeRemoveFile2Request {
3105
+ string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3106
+ string path = 2;
3107
+ bool recursive = 3;
3108
+ }
3109
+
3093
3110
  message VolumeRemoveFileRequest {
3094
3111
  string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3095
3112
  string path = 2;
@@ -3329,10 +3346,12 @@ service ModalClient {
3329
3346
  rpc VolumeHeartbeat(VolumeHeartbeatRequest) returns (google.protobuf.Empty);
3330
3347
  rpc VolumeList(VolumeListRequest) returns (VolumeListResponse);
3331
3348
  rpc VolumeListFiles(VolumeListFilesRequest) returns (stream VolumeListFilesResponse);
3349
+ rpc VolumeListFiles2(VolumeListFiles2Request) returns (stream VolumeListFiles2Response);
3332
3350
  rpc VolumePutFiles(VolumePutFilesRequest) returns (google.protobuf.Empty);
3333
3351
  rpc VolumePutFiles2(VolumePutFiles2Request) returns (VolumePutFiles2Response);
3334
3352
  rpc VolumeReload(VolumeReloadRequest) returns (google.protobuf.Empty);
3335
3353
  rpc VolumeRemoveFile(VolumeRemoveFileRequest) returns (google.protobuf.Empty);
3354
+ rpc VolumeRemoveFile2(VolumeRemoveFile2Request) returns (google.protobuf.Empty);
3336
3355
  rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
3337
3356
 
3338
3357
  // Workspaces
@@ -598,6 +598,10 @@ class ModalClientBase(abc.ABC):
598
598
  async def VolumeListFiles(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeListFilesRequest, modal_proto.api_pb2.VolumeListFilesResponse]') -> None:
599
599
  pass
600
600
 
601
+ @abc.abstractmethod
602
+ async def VolumeListFiles2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeListFiles2Request, modal_proto.api_pb2.VolumeListFiles2Response]') -> None:
603
+ pass
604
+
601
605
  @abc.abstractmethod
602
606
  async def VolumePutFiles(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumePutFilesRequest, google.protobuf.empty_pb2.Empty]') -> None:
603
607
  pass
@@ -614,6 +618,10 @@ class ModalClientBase(abc.ABC):
614
618
  async def VolumeRemoveFile(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRemoveFileRequest, google.protobuf.empty_pb2.Empty]') -> None:
615
619
  pass
616
620
 
621
+ @abc.abstractmethod
622
+ async def VolumeRemoveFile2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRemoveFile2Request, google.protobuf.empty_pb2.Empty]') -> None:
623
+ pass
624
+
617
625
  @abc.abstractmethod
618
626
  async def VolumeRename(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.VolumeRenameRequest, google.protobuf.empty_pb2.Empty]') -> None:
619
627
  pass
@@ -1494,6 +1502,12 @@ class ModalClientBase(abc.ABC):
1494
1502
  modal_proto.api_pb2.VolumeListFilesRequest,
1495
1503
  modal_proto.api_pb2.VolumeListFilesResponse,
1496
1504
  ),
1505
+ '/modal.client.ModalClient/VolumeListFiles2': grpclib.const.Handler(
1506
+ self.VolumeListFiles2,
1507
+ grpclib.const.Cardinality.UNARY_STREAM,
1508
+ modal_proto.api_pb2.VolumeListFiles2Request,
1509
+ modal_proto.api_pb2.VolumeListFiles2Response,
1510
+ ),
1497
1511
  '/modal.client.ModalClient/VolumePutFiles': grpclib.const.Handler(
1498
1512
  self.VolumePutFiles,
1499
1513
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1518,6 +1532,12 @@ class ModalClientBase(abc.ABC):
1518
1532
  modal_proto.api_pb2.VolumeRemoveFileRequest,
1519
1533
  google.protobuf.empty_pb2.Empty,
1520
1534
  ),
1535
+ '/modal.client.ModalClient/VolumeRemoveFile2': grpclib.const.Handler(
1536
+ self.VolumeRemoveFile2,
1537
+ grpclib.const.Cardinality.UNARY_UNARY,
1538
+ modal_proto.api_pb2.VolumeRemoveFile2Request,
1539
+ google.protobuf.empty_pb2.Empty,
1540
+ ),
1521
1541
  '/modal.client.ModalClient/VolumeRename': grpclib.const.Handler(
1522
1542
  self.VolumeRename,
1523
1543
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2406,6 +2426,12 @@ class ModalClientStub:
2406
2426
  modal_proto.api_pb2.VolumeListFilesRequest,
2407
2427
  modal_proto.api_pb2.VolumeListFilesResponse,
2408
2428
  )
2429
+ self.VolumeListFiles2 = grpclib.client.UnaryStreamMethod(
2430
+ channel,
2431
+ '/modal.client.ModalClient/VolumeListFiles2',
2432
+ modal_proto.api_pb2.VolumeListFiles2Request,
2433
+ modal_proto.api_pb2.VolumeListFiles2Response,
2434
+ )
2409
2435
  self.VolumePutFiles = grpclib.client.UnaryUnaryMethod(
2410
2436
  channel,
2411
2437
  '/modal.client.ModalClient/VolumePutFiles',
@@ -2430,6 +2456,12 @@ class ModalClientStub:
2430
2456
  modal_proto.api_pb2.VolumeRemoveFileRequest,
2431
2457
  google.protobuf.empty_pb2.Empty,
2432
2458
  )
2459
+ self.VolumeRemoveFile2 = grpclib.client.UnaryUnaryMethod(
2460
+ channel,
2461
+ '/modal.client.ModalClient/VolumeRemoveFile2',
2462
+ modal_proto.api_pb2.VolumeRemoveFile2Request,
2463
+ google.protobuf.empty_pb2.Empty,
2464
+ )
2433
2465
  self.VolumeRename = grpclib.client.UnaryUnaryMethod(
2434
2466
  channel,
2435
2467
  '/modal.client.ModalClient/VolumeRename',