modal 1.2.1.dev16__tar.gz → 1.2.1.dev18__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 (198) hide show
  1. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/PKG-INFO +1 -1
  2. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_partial_function.py +22 -2
  3. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/function_utils.py +4 -0
  4. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/app.py +4 -1
  5. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/client.pyi +2 -2
  6. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/partial_function.pyi +4 -1
  7. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/volume.py +2 -0
  8. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_version/__init__.py +1 -1
  10. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/LICENSE +0 -0
  11. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/README.md +0 -0
  12. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/__init__.py +0 -0
  13. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/__main__.py +0 -0
  14. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_billing.py +0 -0
  15. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_clustered_functions.py +0 -0
  16. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_container_entrypoint.py +0 -0
  18. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_functions.py +0 -0
  19. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_ipython.py +0 -0
  20. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_location.py +0 -0
  21. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_object.py +0 -0
  22. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_output.py +0 -0
  23. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_pty.py +0 -0
  24. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_resolver.py +0 -0
  25. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_resources.py +0 -0
  26. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_runtime/user_code_imports.py +0 -0
  35. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_serialization.py +0 -0
  36. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_traceback.py +0 -0
  37. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_tunnel.py +0 -0
  38. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_tunnel.pyi +0 -0
  39. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_type_manager.py +0 -0
  40. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/__init__.py +0 -0
  41. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/app_utils.py +0 -0
  42. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/async_utils.py +0 -0
  43. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/auth_token_manager.py +0 -0
  44. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/blob_utils.py +0 -0
  45. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/bytes_io_segment_payload.py +0 -0
  46. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/deprecation.py +0 -0
  47. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/docker_utils.py +0 -0
  48. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/logger.py +0 -0
  55. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/task_command_router_client.py +0 -0
  62. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_utils/time_utils.py +0 -0
  63. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_vendor/__init__.py +0 -0
  64. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  65. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_vendor/cloudpickle.py +0 -0
  66. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_vendor/tblib.py +0 -0
  67. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/_watcher.py +0 -0
  68. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/app.pyi +0 -0
  69. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/billing.py +0 -0
  70. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/2023.12.312.txt +0 -0
  71. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/2023.12.txt +0 -0
  72. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/2024.04.txt +0 -0
  73. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/2024.10.txt +0 -0
  74. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/2025.06.txt +0 -0
  75. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/PREVIEW.txt +0 -0
  76. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/README.md +0 -0
  77. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/builder/base-images.json +0 -0
  78. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/call_graph.py +0 -0
  79. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/__init__.py +0 -0
  80. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/_download.py +0 -0
  81. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/_traceback.py +0 -0
  82. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/app.py +0 -0
  83. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/cluster.py +0 -0
  84. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/config.py +0 -0
  85. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/container.py +0 -0
  86. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/dict.py +0 -0
  87. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/entry_point.py +0 -0
  88. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/environment.py +0 -0
  89. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/import_refs.py +0 -0
  90. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/launch.py +0 -0
  91. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/network_file_system.py +0 -0
  92. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/profile.py +0 -0
  93. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/programs/__init__.py +0 -0
  94. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/programs/launch_instance_ssh.py +0 -0
  95. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/programs/run_jupyter.py +0 -0
  96. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/programs/run_marimo.py +0 -0
  97. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/programs/vscode.py +0 -0
  98. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/queues.py +0 -0
  99. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/run.py +0 -0
  100. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/secret.py +0 -0
  101. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/token.py +0 -0
  102. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/utils.py +0 -0
  103. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cli/volume.py +0 -0
  104. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/client.py +0 -0
  105. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cloud_bucket_mount.py +0 -0
  106. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cloud_bucket_mount.pyi +0 -0
  107. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cls.py +0 -0
  108. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/cls.pyi +0 -0
  109. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/config.py +0 -0
  110. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/container_process.py +0 -0
  111. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/container_process.pyi +0 -0
  112. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/dict.py +0 -0
  113. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/dict.pyi +0 -0
  114. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/environments.py +0 -0
  115. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/environments.pyi +0 -0
  116. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/exception.py +0 -0
  117. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/experimental/__init__.py +0 -0
  118. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/experimental/flash.py +0 -0
  119. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/experimental/flash.pyi +0 -0
  120. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/experimental/ipython.py +0 -0
  121. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/file_io.py +0 -0
  122. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/file_io.pyi +0 -0
  123. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/file_pattern_matcher.py +0 -0
  124. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/functions.py +0 -0
  125. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/functions.pyi +0 -0
  126. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/gpu.py +0 -0
  127. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/image.py +0 -0
  128. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/image.pyi +0 -0
  129. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/io_streams.py +0 -0
  130. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/io_streams.pyi +0 -0
  131. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/mount.py +0 -0
  132. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/mount.pyi +0 -0
  133. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/network_file_system.py +0 -0
  134. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/network_file_system.pyi +0 -0
  135. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/object.py +0 -0
  136. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/object.pyi +0 -0
  137. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/output.py +0 -0
  138. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/parallel_map.py +0 -0
  139. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/parallel_map.pyi +0 -0
  140. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/partial_function.py +0 -0
  141. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/proxy.py +0 -0
  142. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/proxy.pyi +0 -0
  143. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/py.typed +0 -0
  144. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/queue.py +0 -0
  145. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/queue.pyi +0 -0
  146. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/retries.py +0 -0
  147. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/runner.py +0 -0
  148. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/runner.pyi +0 -0
  149. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/running_app.py +0 -0
  150. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/sandbox.py +0 -0
  151. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/sandbox.pyi +0 -0
  152. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/schedule.py +0 -0
  153. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/scheduler_placement.py +0 -0
  154. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/secret.py +0 -0
  155. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/secret.pyi +0 -0
  156. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/serving.py +0 -0
  157. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/serving.pyi +0 -0
  158. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/snapshot.py +0 -0
  159. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/snapshot.pyi +0 -0
  160. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/stream_type.py +0 -0
  161. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/token_flow.py +0 -0
  162. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/token_flow.pyi +0 -0
  163. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal/volume.pyi +0 -0
  164. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/SOURCES.txt +0 -0
  165. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/dependency_links.txt +0 -0
  166. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/entry_points.txt +0 -0
  167. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/requires.txt +0 -0
  168. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal.egg-info/top_level.txt +0 -0
  169. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/__init__.py +0 -0
  170. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/gen_cli_docs.py +0 -0
  171. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/gen_reference_docs.py +0 -0
  172. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/mdmd/__init__.py +0 -0
  173. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/mdmd/mdmd.py +0 -0
  174. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_docs/mdmd/signatures.py +0 -0
  175. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/__init__.py +0 -0
  176. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api.proto +0 -0
  177. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api_grpc.py +0 -0
  178. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api_pb2.py +0 -0
  179. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api_pb2.pyi +0 -0
  180. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api_pb2_grpc.py +0 -0
  181. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/api_pb2_grpc.pyi +0 -0
  182. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/modal_api_grpc.py +0 -0
  183. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/py.typed +0 -0
  184. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router.proto +0 -0
  185. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router_grpc.py +0 -0
  186. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2.py +0 -0
  187. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2.pyi +0 -0
  188. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  189. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  190. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router.proto +0 -0
  191. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router_grpc.py +0 -0
  192. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2.py +0 -0
  193. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2.pyi +0 -0
  194. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  195. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  196. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/modal_version/__main__.py +0 -0
  197. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/pyproject.toml +0 -0
  198. {modal-1.2.1.dev16 → modal-1.2.1.dev18}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev16
3
+ Version: 1.2.1.dev18
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -93,6 +93,26 @@ NullaryFuncOrMethod = Union[Callable[[], Any], Callable[[Any], Any]]
93
93
  NullaryMethod = Callable[[Any], Any]
94
94
 
95
95
 
96
+ def verify_concurrent_params(params: _PartialFunctionParams, is_flash: bool = False) -> None:
97
+ def _verify_concurrent_params_with_flash_settings(params: _PartialFunctionParams) -> None:
98
+ if params.max_concurrent_inputs is not None:
99
+ raise TypeError(
100
+ "@modal.concurrent(max_inputs=...) is not yet supported for Flash functions. "
101
+ "Use `@modal.concurrent(target_inputs=...)` instead."
102
+ )
103
+ if params.target_concurrent_inputs is None:
104
+ raise TypeError("`@modal.concurrent()` missing required argument: `target_inputs`.")
105
+
106
+ def _verify_concurrent_params(params: _PartialFunctionParams) -> None:
107
+ if params.max_concurrent_inputs is None:
108
+ raise TypeError("`@modal.concurrent()` missing required argument: `max_inputs`.")
109
+
110
+ if is_flash:
111
+ _verify_concurrent_params_with_flash_settings(params)
112
+ else:
113
+ _verify_concurrent_params(params)
114
+
115
+
96
116
  class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
97
117
  """Object produced by a decorator in the `modal` namespace
98
118
 
@@ -765,7 +785,7 @@ def _batched(
765
785
  def _concurrent(
766
786
  _warn_parentheses_missing=None, # mdmd:line-hidden
767
787
  *,
768
- max_inputs: int, # Hard limit on each container's input concurrency
788
+ max_inputs: Optional[int] = None, # Hard limit on each container's input concurrency
769
789
  target_inputs: Optional[int] = None, # Input concurrency that Modal's autoscaler should target
770
790
  ) -> Callable[
771
791
  [Union[Callable[P, ReturnType], _PartialFunction[P, ReturnType, ReturnType]]],
@@ -817,7 +837,7 @@ def _concurrent(
817
837
  "Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@modal.concurrent()`."
818
838
  )
819
839
 
820
- if target_inputs and target_inputs > max_inputs:
840
+ if max_inputs is not None and target_inputs is not None and target_inputs > max_inputs:
821
841
  raise InvalidError("`target_inputs` parameter cannot be greater than `max_inputs`.")
822
842
 
823
843
  flags = _PartialFunctionFlags.CONCURRENT
@@ -75,6 +75,10 @@ def is_global_object(object_qual_name: str):
75
75
  return "<locals>" not in object_qual_name.split(".")
76
76
 
77
77
 
78
+ def is_flash_object(experimental_options: Optional[dict[str, Any]]) -> bool:
79
+ return experimental_options.get("flash", False) if experimental_options else False
80
+
81
+
78
82
  def is_method_fn(object_qual_name: str):
79
83
  # methods have names like Cls.foo.
80
84
  if "<locals>" in object_qual_name:
@@ -27,13 +27,14 @@ from ._partial_function import (
27
27
  _find_partial_methods_for_user_cls,
28
28
  _PartialFunction,
29
29
  _PartialFunctionFlags,
30
+ verify_concurrent_params,
30
31
  )
31
32
  from ._utils.async_utils import synchronize_api
32
33
  from ._utils.deprecation import (
33
34
  deprecation_warning,
34
35
  warn_on_renamed_autoscaler_settings,
35
36
  )
36
- from ._utils.function_utils import FunctionInfo, is_global_object, is_method_fn
37
+ from ._utils.function_utils import FunctionInfo, is_flash_object, is_global_object, is_method_fn
37
38
  from ._utils.grpc_utils import retry_transient_errors
38
39
  from ._utils.mount_utils import validate_volumes
39
40
  from ._utils.name_utils import check_object_name, check_tag_dict
@@ -802,6 +803,7 @@ class _App:
802
803
  batch_max_size = f.params.batch_max_size
803
804
  batch_wait_ms = f.params.batch_wait_ms
804
805
  if f.flags & _PartialFunctionFlags.CONCURRENT:
806
+ verify_concurrent_params(params=f.params, is_flash=is_flash_object(experimental_options))
805
807
  max_concurrent_inputs = f.params.max_concurrent_inputs
806
808
  target_concurrent_inputs = f.params.target_concurrent_inputs
807
809
  else:
@@ -996,6 +998,7 @@ class _App:
996
998
  wrapped_cls.registered = True
997
999
  user_cls = wrapped_cls.user_cls
998
1000
  if wrapped_cls.flags & _PartialFunctionFlags.CONCURRENT:
1001
+ verify_concurrent_params(params=wrapped_cls.params, is_flash=is_flash_object(experimental_options))
999
1002
  max_concurrent_inputs = wrapped_cls.params.max_concurrent_inputs
1000
1003
  target_concurrent_inputs = wrapped_cls.params.target_concurrent_inputs
1001
1004
  else:
@@ -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.2.1.dev16",
36
+ version: str = "1.2.1.dev18",
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.2.1.dev16",
167
+ version: str = "1.2.1.dev18",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -329,7 +329,10 @@ def batched(
329
329
  ...
330
330
 
331
331
  def concurrent(
332
- _warn_parentheses_missing=None, *, max_inputs: int, target_inputs: typing.Optional[int] = None
332
+ _warn_parentheses_missing=None,
333
+ *,
334
+ max_inputs: typing.Optional[int] = None,
335
+ target_inputs: typing.Optional[int] = None,
333
336
  ) -> collections.abc.Callable[
334
337
  [
335
338
  typing.Union[
@@ -655,6 +655,7 @@ class _Volume(_Object, type_prefix="vo"):
655
655
  @retry(n_attempts=5, base_delay=0.1, timeout=None)
656
656
  async def read_block(block_url: str) -> bytes:
657
657
  async with ClientSessionRegistry.get_session().get(block_url) as get_response:
658
+ get_response.raise_for_status()
658
659
  return await get_response.content.read()
659
660
 
660
661
  async def iter_urls() -> AsyncGenerator[str]:
@@ -716,6 +717,7 @@ class _Volume(_Object, type_prefix="vo"):
716
717
  num_bytes_written = 0
717
718
 
718
719
  async with download_semaphore, ClientSessionRegistry.get_session().get(url) as get_response:
720
+ get_response.raise_for_status()
719
721
  async for chunk in get_response.content.iter_any():
720
722
  num_chunk_bytes_written = 0
721
723
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev16
3
+ Version: 1.2.1.dev18
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.2.1.dev16"
4
+ __version__ = "1.2.1.dev18"
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