modal 1.1.5.dev1__tar.gz → 1.1.5.dev2__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 (190) hide show
  1. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/client.pyi +2 -2
  3. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/container_process.py +2 -0
  4. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/functions.pyi +6 -6
  5. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/io_streams.py +4 -0
  6. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/sandbox.py +4 -1
  7. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_version/__init__.py +1 -1
  9. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/LICENSE +0 -0
  10. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/README.md +0 -0
  11. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/__init__.py +0 -0
  12. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/__main__.py +0 -0
  13. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_clustered_functions.py +0 -0
  14. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_functions.py +0 -0
  17. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_ipython.py +0 -0
  18. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_location.py +0 -0
  19. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_object.py +0 -0
  20. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_output.py +0 -0
  21. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_partial_function.py +0 -0
  22. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_pty.py +0 -0
  23. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_resolver.py +0 -0
  24. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_resources.py +0 -0
  25. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/__init__.py +0 -0
  26. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/asgi.py +0 -0
  27. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/execution_context.py +0 -0
  30. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/telemetry.py +0 -0
  33. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_serialization.py +0 -0
  35. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_traceback.py +0 -0
  36. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_tunnel.py +0 -0
  37. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_tunnel.pyi +0 -0
  38. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_type_manager.py +0 -0
  39. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/__init__.py +0 -0
  40. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/async_utils.py +0 -0
  42. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/auth_token_manager.py +0 -0
  43. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/blob_utils.py +0 -0
  44. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/function_utils.py +0 -0
  48. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/logger.py +0 -0
  55. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_utils/time_utils.py +0 -0
  62. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_vendor/__init__.py +0 -0
  63. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  64. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_vendor/cloudpickle.py +0 -0
  65. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_vendor/tblib.py +0 -0
  66. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/_watcher.py +0 -0
  67. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/app.py +0 -0
  68. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/app.pyi +0 -0
  69. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/2023.12.312.txt +0 -0
  70. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/2023.12.txt +0 -0
  71. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/2024.04.txt +0 -0
  72. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/2024.10.txt +0 -0
  73. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/2025.06.txt +0 -0
  74. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/PREVIEW.txt +0 -0
  75. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/README.md +0 -0
  76. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/builder/base-images.json +0 -0
  77. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/call_graph.py +0 -0
  78. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/__init__.py +0 -0
  79. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/_download.py +0 -0
  80. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/_traceback.py +0 -0
  81. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/app.py +0 -0
  82. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/cluster.py +0 -0
  83. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/config.py +0 -0
  84. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/container.py +0 -0
  85. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/dict.py +0 -0
  86. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/entry_point.py +0 -0
  87. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/environment.py +0 -0
  88. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/import_refs.py +0 -0
  89. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/launch.py +0 -0
  90. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/network_file_system.py +0 -0
  91. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/profile.py +0 -0
  92. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/programs/__init__.py +0 -0
  93. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/programs/launch_instance_ssh.py +0 -0
  94. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/programs/run_jupyter.py +0 -0
  95. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/programs/run_marimo.py +0 -0
  96. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/programs/vscode.py +0 -0
  97. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/queues.py +0 -0
  98. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/run.py +0 -0
  99. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/secret.py +0 -0
  100. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/token.py +0 -0
  101. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/utils.py +0 -0
  102. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cli/volume.py +0 -0
  103. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/client.py +0 -0
  104. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cloud_bucket_mount.py +0 -0
  105. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cloud_bucket_mount.pyi +0 -0
  106. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cls.py +0 -0
  107. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/cls.pyi +0 -0
  108. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/config.py +0 -0
  109. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/container_process.pyi +0 -0
  110. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/dict.py +0 -0
  111. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/dict.pyi +0 -0
  112. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/environments.py +0 -0
  113. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/environments.pyi +0 -0
  114. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/exception.py +0 -0
  115. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/experimental/__init__.py +0 -0
  116. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/experimental/flash.py +0 -0
  117. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/experimental/flash.pyi +0 -0
  118. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/experimental/ipython.py +0 -0
  119. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/file_io.py +0 -0
  120. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/file_io.pyi +0 -0
  121. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/file_pattern_matcher.py +0 -0
  122. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/functions.py +0 -0
  123. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/gpu.py +0 -0
  124. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/image.py +0 -0
  125. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/image.pyi +0 -0
  126. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/io_streams.pyi +0 -0
  127. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/mount.py +0 -0
  128. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/mount.pyi +0 -0
  129. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/network_file_system.py +0 -0
  130. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/network_file_system.pyi +0 -0
  131. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/object.py +0 -0
  132. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/object.pyi +0 -0
  133. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/output.py +0 -0
  134. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/parallel_map.py +0 -0
  135. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/parallel_map.pyi +0 -0
  136. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/partial_function.py +0 -0
  137. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/partial_function.pyi +0 -0
  138. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/proxy.py +0 -0
  139. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/proxy.pyi +0 -0
  140. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/py.typed +0 -0
  141. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/queue.py +0 -0
  142. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/queue.pyi +0 -0
  143. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/retries.py +0 -0
  144. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/runner.py +0 -0
  145. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/runner.pyi +0 -0
  146. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/running_app.py +0 -0
  147. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/sandbox.pyi +0 -0
  148. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/schedule.py +0 -0
  149. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/secret.py +0 -0
  151. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/secret.pyi +0 -0
  152. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/serving.py +0 -0
  153. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/serving.pyi +0 -0
  154. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/snapshot.py +0 -0
  155. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/stream_type.py +0 -0
  157. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/token_flow.py +0 -0
  158. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/volume.py +0 -0
  160. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal/volume.pyi +0 -0
  161. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api.proto +0 -0
  174. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/modal_version/__main__.py +0 -0
  189. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/pyproject.toml +0 -0
  190. {modal-1.1.5.dev1 → modal-1.1.5.dev2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev1
3
+ Version: 1.1.5.dev2
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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.5.dev1",
36
+ version: str = "1.1.5.dev2",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev1",
167
+ version: str = "1.1.5.dev2",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -10,6 +10,7 @@ from ._utils.async_utils import TaskContext, synchronize_api
10
10
  from ._utils.grpc_utils import retry_transient_errors
11
11
  from ._utils.shell_utils import stream_from_stdin, write_to_fd
12
12
  from .client import _Client
13
+ from .config import logger
13
14
  from .exception import InteractiveTimeoutError, InvalidError
14
15
  from .io_streams import _StreamReader, _StreamWriter
15
16
  from .stream_type import StreamType
@@ -136,6 +137,7 @@ class _ContainerProcess(Generic[T]):
136
137
  self._returncode = await asyncio.wait_for(self._wait_for_completion(), timeout=timeout)
137
138
  except (asyncio.TimeoutError, TimeoutError):
138
139
  self._returncode = -1
140
+ logger.debug(f"ContainerProcess {self._process_id} wait completed with returncode {self._returncode}")
139
141
  return self._returncode
140
142
 
141
143
  async def attach(self):
@@ -445,7 +445,7 @@ class Function(
445
445
 
446
446
  _call_generator: ___call_generator_spec[typing_extensions.Self]
447
447
 
448
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
448
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
449
449
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
450
450
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
451
451
  ...
@@ -454,7 +454,7 @@ class Function(
454
454
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
455
455
  ...
456
456
 
457
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
457
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
458
458
 
459
459
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
460
460
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -481,7 +481,7 @@ class Function(
481
481
  """
482
482
  ...
483
483
 
484
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
484
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
485
485
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
486
486
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
487
487
 
@@ -505,7 +505,7 @@ class Function(
505
505
  ...
506
506
 
507
507
  _experimental_spawn: ___experimental_spawn_spec[
508
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
508
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
509
509
  ]
510
510
 
511
511
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -514,7 +514,7 @@ class Function(
514
514
 
515
515
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
516
516
 
517
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
517
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
518
518
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
519
519
  """Calls the function with the given arguments, without waiting for the results.
520
520
 
@@ -535,7 +535,7 @@ class Function(
535
535
  """
536
536
  ...
537
537
 
538
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
538
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
539
539
 
540
540
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
541
541
  """Return the inner Python object wrapped by this Modal Function."""
@@ -21,6 +21,7 @@ from modal_proto import api_pb2
21
21
  from ._utils.async_utils import synchronize_api
22
22
  from ._utils.grpc_utils import RETRYABLE_GRPC_STATUS_CODES, retry_transient_errors
23
23
  from .client import _Client
24
+ from .config import logger
24
25
  from .stream_type import StreamType
25
26
 
26
27
  if TYPE_CHECKING:
@@ -180,6 +181,7 @@ class _StreamReader(Generic[T]):
180
181
  """
181
182
  data_str = ""
182
183
  data_bytes = b""
184
+ logger.debug(f"{self._object_id} StreamReader fd={self._file_descriptor} read starting")
183
185
  async for message in self._get_logs():
184
186
  if message is None:
185
187
  break
@@ -188,6 +190,7 @@ class _StreamReader(Generic[T]):
188
190
  else:
189
191
  data_bytes += message
190
192
 
193
+ logger.debug(f"{self._object_id} StreamReader fd={self._file_descriptor} read completed after EOF")
191
194
  if self._text:
192
195
  return cast(T, data_str)
193
196
  else:
@@ -232,6 +235,7 @@ class _StreamReader(Generic[T]):
232
235
  elif isinstance(exc, ClientClosed):
233
236
  # If the client was closed, the user has triggered a cleanup.
234
237
  break
238
+ logger.error(f"{self._object_id} stream read failure while consuming process output: {exc}")
235
239
  raise exc
236
240
 
237
241
  async def _stream_container_process(self) -> AsyncGenerator[tuple[Optional[bytes], str], None]:
@@ -5,6 +5,8 @@ import time
5
5
  from collections.abc import AsyncGenerator, Sequence
6
6
  from typing import TYPE_CHECKING, AsyncIterator, Literal, Optional, Union, overload
7
7
 
8
+ from .config import config, logger
9
+
8
10
  if TYPE_CHECKING:
9
11
  import _typeshed
10
12
 
@@ -26,7 +28,6 @@ from ._utils.grpc_utils import retry_transient_errors
26
28
  from ._utils.mount_utils import validate_network_file_systems, validate_volumes
27
29
  from ._utils.name_utils import is_valid_object_name
28
30
  from .client import _Client
29
- from .config import config
30
31
  from .container_process import _ContainerProcess
31
32
  from .exception import AlreadyExistsError, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
32
33
  from .file_io import FileWatchEvent, FileWatchEventType, _FileIO
@@ -588,6 +589,7 @@ class _Sandbox(_Object, type_prefix="sb"):
588
589
  req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=10)
589
590
  resp = await retry_transient_errors(self._client.stub.SandboxWait, req)
590
591
  if resp.result.status:
592
+ logger.debug(f"Sandbox {self.object_id} wait completed with status {resp.result.status}")
591
593
  self._result = resp.result
592
594
 
593
595
  if resp.result.status == api_pb2.GenericResult.GENERIC_STATUS_TIMEOUT:
@@ -757,6 +759,7 @@ class _Sandbox(_Object, type_prefix="sb"):
757
759
  resp = await retry_transient_errors(self._client.stub.ContainerExec, req)
758
760
  by_line = bufsize == 1
759
761
  exec_deadline = time.monotonic() + int(timeout) + CONTAINER_EXEC_TIMEOUT_BUFFER if timeout else None
762
+ logger.debug(f"Created ContainerProcess for exec_id {resp.exec_id} on Sandbox {self.object_id}")
760
763
  return _ContainerProcess(
761
764
  resp.exec_id,
762
765
  self._client,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev1
3
+ Version: 1.1.5.dev2
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.5.dev1"
4
+ __version__ = "1.1.5.dev2"
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