modal 1.1.5.dev39__tar.gz → 1.1.5.dev41__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 (196) hide show
  1. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_functions.py +25 -26
  3. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/client.pyi +2 -2
  4. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/runner.py +5 -1
  5. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_version/__init__.py +1 -1
  7. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/LICENSE +0 -0
  8. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/README.md +0 -0
  9. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/__init__.py +0 -0
  10. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/__main__.py +0 -0
  11. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_clustered_functions.py +0 -0
  12. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_clustered_functions.pyi +0 -0
  13. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_container_entrypoint.py +0 -0
  14. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_ipython.py +0 -0
  15. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_location.py +0 -0
  16. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_object.py +0 -0
  17. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_output.py +0 -0
  18. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_partial_function.py +0 -0
  19. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_pty.py +0 -0
  20. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_resolver.py +0 -0
  21. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_resources.py +0 -0
  22. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/__init__.py +0 -0
  23. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/asgi.py +0 -0
  24. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/container_io_manager.py +0 -0
  25. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/container_io_manager.pyi +0 -0
  26. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/execution_context.py +0 -0
  27. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/execution_context.pyi +0 -0
  28. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  29. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/telemetry.py +0 -0
  30. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_runtime/user_code_imports.py +0 -0
  31. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_serialization.py +0 -0
  32. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_traceback.py +0 -0
  33. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_tunnel.py +0 -0
  34. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_tunnel.pyi +0 -0
  35. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_type_manager.py +0 -0
  36. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/__init__.py +0 -0
  37. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/app_utils.py +0 -0
  38. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/async_utils.py +0 -0
  39. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/auth_token_manager.py +0 -0
  40. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/function_utils.py +0 -0
  45. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/git_utils.py +0 -0
  46. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/hash_utils.py +0 -0
  49. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/http_utils.py +0 -0
  50. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/logger.py +0 -0
  52. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/mount_utils.py +0 -0
  53. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/name_utils.py +0 -0
  54. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/package_utils.py +0 -0
  55. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/shell_utils.py +0 -0
  58. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_utils/time_utils.py +0 -0
  59. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_vendor/__init__.py +0 -0
  60. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_vendor/tblib.py +0 -0
  63. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/_watcher.py +0 -0
  64. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/app.py +0 -0
  65. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/app.pyi +0 -0
  66. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/2023.12.312.txt +0 -0
  67. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/2023.12.txt +0 -0
  68. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/2024.04.txt +0 -0
  69. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/2024.10.txt +0 -0
  70. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/2025.06.txt +0 -0
  71. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/PREVIEW.txt +0 -0
  72. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/README.md +0 -0
  73. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/builder/base-images.json +0 -0
  74. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/call_graph.py +0 -0
  75. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/__init__.py +0 -0
  76. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/_download.py +0 -0
  77. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/_traceback.py +0 -0
  78. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/app.py +0 -0
  79. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/cluster.py +0 -0
  80. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/config.py +0 -0
  81. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/container.py +0 -0
  82. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/dict.py +0 -0
  83. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/entry_point.py +0 -0
  84. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/environment.py +0 -0
  85. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/import_refs.py +0 -0
  86. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/launch.py +0 -0
  87. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/network_file_system.py +0 -0
  88. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/profile.py +0 -0
  89. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/programs/__init__.py +0 -0
  90. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/programs/launch_instance_ssh.py +0 -0
  91. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/programs/run_jupyter.py +0 -0
  92. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/programs/run_marimo.py +0 -0
  93. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/programs/vscode.py +0 -0
  94. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/queues.py +0 -0
  95. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/run.py +0 -0
  96. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/secret.py +0 -0
  97. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/token.py +0 -0
  98. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/utils.py +0 -0
  99. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cli/volume.py +0 -0
  100. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/client.py +0 -0
  101. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cloud_bucket_mount.py +0 -0
  102. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cloud_bucket_mount.pyi +0 -0
  103. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cls.py +0 -0
  104. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/cls.pyi +0 -0
  105. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/config.py +0 -0
  106. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/container_process.py +0 -0
  107. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/container_process.pyi +0 -0
  108. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/dict.py +0 -0
  109. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/dict.pyi +0 -0
  110. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/environments.py +0 -0
  111. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/environments.pyi +0 -0
  112. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/exception.py +0 -0
  113. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/experimental/__init__.py +0 -0
  114. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/experimental/flash.py +0 -0
  115. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/experimental/flash.pyi +0 -0
  116. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/experimental/ipython.py +0 -0
  117. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/file_io.py +0 -0
  118. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/file_io.pyi +0 -0
  119. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/file_pattern_matcher.py +0 -0
  120. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/functions.py +0 -0
  121. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/functions.pyi +0 -0
  122. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/gpu.py +0 -0
  123. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/image.py +0 -0
  124. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/image.pyi +0 -0
  125. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/io_streams.py +0 -0
  126. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/io_streams.pyi +0 -0
  127. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/mount.py +0 -0
  128. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/mount.pyi +0 -0
  129. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/network_file_system.py +0 -0
  130. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/network_file_system.pyi +0 -0
  131. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/object.py +0 -0
  132. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/object.pyi +0 -0
  133. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/output.py +0 -0
  134. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/parallel_map.py +0 -0
  135. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/parallel_map.pyi +0 -0
  136. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/partial_function.py +0 -0
  137. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/partial_function.pyi +0 -0
  138. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/proxy.py +0 -0
  139. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/proxy.pyi +0 -0
  140. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/py.typed +0 -0
  141. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/queue.py +0 -0
  142. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/queue.pyi +0 -0
  143. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/retries.py +0 -0
  144. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/runner.pyi +0 -0
  145. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/running_app.py +0 -0
  146. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/sandbox.py +0 -0
  147. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/sandbox.pyi +0 -0
  148. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/schedule.py +0 -0
  149. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/secret.py +0 -0
  151. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/secret.pyi +0 -0
  152. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/serving.py +0 -0
  153. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/serving.pyi +0 -0
  154. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/snapshot.py +0 -0
  155. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/stream_type.py +0 -0
  157. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/token_flow.py +0 -0
  158. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/volume.py +0 -0
  160. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal/volume.pyi +0 -0
  161. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api.proto +0 -0
  174. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router.proto +0 -0
  189. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router_grpc.py +0 -0
  190. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router_pb2.py +0 -0
  191. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router_pb2.pyi +0 -0
  192. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  193. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  194. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/modal_version/__main__.py +0 -0
  195. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/pyproject.toml +0 -0
  196. {modal-1.1.5.dev39 → modal-1.1.5.dev41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev39
3
+ Version: 1.1.5.dev41
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -477,34 +477,34 @@ class _InputPlaneInvocation:
477
477
  metadata=metadata,
478
478
  )
479
479
 
480
- if await_response.HasField("output"):
481
- if await_response.output.result.status in TERMINAL_STATUSES:
482
- return await _process_result(
483
- await_response.output.result, await_response.output.data_format, self.client.stub, self.client
484
- )
485
-
486
- if await_response.output.result.status == api_pb2.GenericResult.GENERIC_STATUS_INTERNAL_FAILURE:
487
- internal_failure_count += 1
488
- # Limit the number of times we retry
489
- if internal_failure_count < MAX_INTERNAL_FAILURE_COUNT:
490
- # For system failures on the server, we retry immediately,
491
- # and the failure does not count towards the retry policy.
492
- self.attempt_token = await self._retry_input(metadata)
493
- continue
480
+ # Keep awaiting until we get an output.
481
+ if not await_response.HasField("output"):
482
+ continue
483
+
484
+ # If we have a final output, return.
485
+ if await_response.output.result.status in TERMINAL_STATUSES:
486
+ return await _process_result(
487
+ await_response.output.result, await_response.output.data_format, self.client.stub, self.client
488
+ )
494
489
 
495
- # We add delays between retries for non-internal failures.
496
- delay_ms = user_retry_manager.get_delay_ms()
497
- if delay_ms is None:
498
- # No more retries either because we reached the retry limit or user didn't set a retry policy
499
- # and the limit defaulted to 0.
500
- # An unsuccessful status should raise an error when it's converted to an exception.
501
- # Note: Blob download is done on the control plane stub not the input plane stub!
502
- return await _process_result(
503
- await_response.output.result, await_response.output.data_format, self.client.stub, self.client
504
- )
490
+ # We have a failure (internal or application), so see if there are any retries left, and if so, retry.
491
+ if await_response.output.result.status == api_pb2.GenericResult.GENERIC_STATUS_INTERNAL_FAILURE:
492
+ internal_failure_count += 1
493
+ # Limit the number of times we retry internal failures.
494
+ if internal_failure_count < MAX_INTERNAL_FAILURE_COUNT:
495
+ # We immediately retry internal failures and the failure doesn't count towards the retry policy.
496
+ self.attempt_token = await self._retry_input(metadata)
497
+ continue
498
+ elif (delay_ms := user_retry_manager.get_delay_ms()) is not None:
499
+ # We still have user retries left, so sleep and retry.
505
500
  await asyncio.sleep(delay_ms / 1000)
501
+ self.attempt_token = await self._retry_input(metadata)
502
+ continue
506
503
 
507
- await self._retry_input(metadata)
504
+ # No more retries left.
505
+ return await _process_result(
506
+ await_response.output.result, await_response.output.data_format, self.client.stub, self.client
507
+ )
508
508
 
509
509
  async def _retry_input(self, metadata: list[tuple[str, str]]) -> str:
510
510
  retry_request = api_pb2.AttemptRetryRequest(
@@ -513,7 +513,6 @@ class _InputPlaneInvocation:
513
513
  input=self.input_item,
514
514
  attempt_token=self.attempt_token,
515
515
  )
516
- # TODO(ryan): Add exponential backoff?
517
516
  retry_response = await retry_transient_errors(
518
517
  self.stub.AttemptRetry,
519
518
  retry_request,
@@ -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.dev39",
36
+ version: str = "1.1.5.dev41",
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.dev39",
167
+ version: str = "1.1.5.dev41",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -360,8 +360,12 @@ async def _run_app(
360
360
 
361
361
  # Yield to context
362
362
  if output_mgr := _get_output_manager():
363
- with output_mgr.show_status_spinner():
363
+ # Don't show status spinner in interactive mode to avoid interfering with breakpoints
364
+ if interactive:
364
365
  yield app
366
+ else:
367
+ with output_mgr.show_status_spinner():
368
+ yield app
365
369
  else:
366
370
  yield app
367
371
  # successful completion!
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev39
3
+ Version: 1.1.5.dev41
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.dev39"
4
+ __version__ = "1.1.5.dev41"
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