modal 1.4.4.dev18__tar.gz → 1.4.4.dev20__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 (223) hide show
  1. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/PKG-INFO +1 -1
  2. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_image.py +102 -0
  3. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/client.pyi +2 -2
  4. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/functions.pyi +6 -6
  5. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/image.pyi +71 -0
  6. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/api_pb2.py +810 -810
  8. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/api_pb2.pyi +4 -1
  9. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_version/__init__.py +1 -1
  10. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/LICENSE +0 -0
  11. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/README.md +0 -0
  12. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/__init__.py +0 -0
  13. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/__main__.py +0 -0
  14. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_billing.py +0 -0
  15. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_clustered_functions.py +0 -0
  16. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_container_entrypoint.py +0 -0
  18. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_environments.py +0 -0
  19. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_function_variants.py +0 -0
  20. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_functions.py +0 -0
  21. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_grpc_client.py +0 -0
  22. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_ipython.py +0 -0
  23. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_load_context.py +0 -0
  24. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_location.py +0 -0
  25. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_logs.py +0 -0
  26. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_object.py +0 -0
  27. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_output/__init__.py +0 -0
  28. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_output/manager.py +0 -0
  29. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_output/pty.py +0 -0
  30. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_output/rich.py +0 -0
  31. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_output/status.py +0 -0
  32. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_partial_function.py +0 -0
  33. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_resolver.py +0 -0
  34. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_resources.py +0 -0
  35. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/__init__.py +0 -0
  36. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/asgi.py +0 -0
  37. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/container_io_manager.py +0 -0
  38. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/container_io_manager.pyi +0 -0
  39. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/execution_context.py +0 -0
  40. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/execution_context.pyi +0 -0
  41. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  42. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/task_lifecycle_manager.py +0 -0
  43. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  44. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/telemetry.py +0 -0
  45. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/user_code_event_loop.py +0 -0
  46. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_runtime/user_code_imports.py +0 -0
  47. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_serialization.py +0 -0
  48. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_server.py +0 -0
  49. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_traceback.py +0 -0
  50. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_tunnel.py +0 -0
  51. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_tunnel.pyi +0 -0
  52. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_type_manager.py +0 -0
  53. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/__init__.py +0 -0
  54. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/app_utils.py +0 -0
  55. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/async_utils.py +0 -0
  56. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/auth_token_manager.py +0 -0
  57. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/blob_utils.py +0 -0
  58. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/browser_utils.py +0 -0
  59. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/bytes_io_segment_payload.py +0 -0
  60. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/deprecation.py +0 -0
  61. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/docker_utils.py +0 -0
  62. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/function_utils.py +0 -0
  63. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/git_utils.py +0 -0
  64. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/grpc_testing.py +0 -0
  65. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/grpc_utils.py +0 -0
  66. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/hash_utils.py +0 -0
  67. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/http_utils.py +0 -0
  68. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/jwt_utils.py +0 -0
  69. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/logger.py +0 -0
  70. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/mount_utils.py +0 -0
  71. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/name_utils.py +0 -0
  72. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/package_utils.py +0 -0
  73. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/pattern_utils.py +0 -0
  74. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/rand_pb_testing.py +0 -0
  75. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/sandbox_fs_utils.py +0 -0
  76. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/shell_utils.py +0 -0
  77. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/task_command_router_client.py +0 -0
  78. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_utils/time_utils.py +0 -0
  79. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_vendor/__init__.py +0 -0
  80. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  81. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_vendor/cloudpickle.py +0 -0
  82. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_vendor/tblib.py +0 -0
  83. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_vendor/version.py +0 -0
  84. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_watcher.py +0 -0
  85. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/_workspace.py +0 -0
  86. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/app.py +0 -0
  87. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/app.pyi +0 -0
  88. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/billing.py +0 -0
  89. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/2023.12.312.txt +0 -0
  90. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/2023.12.txt +0 -0
  91. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/2024.04.txt +0 -0
  92. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/2024.10.txt +0 -0
  93. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/2025.06.txt +0 -0
  94. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/PREVIEW.txt +0 -0
  95. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/README.md +0 -0
  96. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/builder/base-images.json +0 -0
  97. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/call_graph.py +0 -0
  98. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/__init__.py +0 -0
  99. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/_download.py +0 -0
  100. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/_help.py +0 -0
  101. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/_traceback.py +0 -0
  102. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/app.py +0 -0
  103. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/billing.py +0 -0
  104. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/bootstrap.py +0 -0
  105. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/changelog.py +0 -0
  106. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/cluster.py +0 -0
  107. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/config.py +0 -0
  108. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/container.py +0 -0
  109. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/dashboard.py +0 -0
  110. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/dict.py +0 -0
  111. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/entry_point.py +0 -0
  112. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/environment.py +0 -0
  113. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/import_refs.py +0 -0
  114. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/launch.py +0 -0
  115. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/logo.py +0 -0
  116. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/network_file_system.py +0 -0
  117. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/profile.py +0 -0
  118. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/programs/__init__.py +0 -0
  119. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/programs/run_jupyter.py +0 -0
  120. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/programs/vscode.py +0 -0
  121. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/queues.py +0 -0
  122. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/run.py +0 -0
  123. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/secret.py +0 -0
  124. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/selector.py +0 -0
  125. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/shell.py +0 -0
  126. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/skills.py +0 -0
  127. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/token.py +0 -0
  128. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/utils.py +0 -0
  129. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cli/volume.py +0 -0
  130. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/client.py +0 -0
  131. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cloud_bucket_mount.py +0 -0
  132. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cloud_bucket_mount.pyi +0 -0
  133. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cls.py +0 -0
  134. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/cls.pyi +0 -0
  135. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/config.py +0 -0
  136. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/container_process.py +0 -0
  137. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/container_process.pyi +0 -0
  138. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/dict.py +0 -0
  139. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/dict.pyi +0 -0
  140. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/environments.py +0 -0
  141. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/environments.pyi +0 -0
  142. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/exception.py +0 -0
  143. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/experimental/__init__.py +0 -0
  144. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/experimental/flash.py +0 -0
  145. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/experimental/flash.pyi +0 -0
  146. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/experimental/ipython.py +0 -0
  147. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/file_io.py +0 -0
  148. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/file_io.pyi +0 -0
  149. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/file_pattern_matcher.py +0 -0
  150. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/functions.py +0 -0
  151. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/image.py +0 -0
  152. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/io_streams.py +0 -0
  153. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/io_streams.pyi +0 -0
  154. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/mount.py +0 -0
  155. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/mount.pyi +0 -0
  156. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/network_file_system.py +0 -0
  157. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/network_file_system.pyi +0 -0
  158. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/object.py +0 -0
  159. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/object.pyi +0 -0
  160. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/output.py +0 -0
  161. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/parallel_map.py +0 -0
  162. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/parallel_map.pyi +0 -0
  163. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/partial_function.py +0 -0
  164. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/partial_function.pyi +0 -0
  165. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/proxy.py +0 -0
  166. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/proxy.pyi +0 -0
  167. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/py.typed +0 -0
  168. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/queue.py +0 -0
  169. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/queue.pyi +0 -0
  170. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/retries.py +0 -0
  171. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/runner.py +0 -0
  172. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/runner.pyi +0 -0
  173. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/running_app.py +0 -0
  174. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/sandbox.py +0 -0
  175. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/sandbox.pyi +0 -0
  176. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/sandbox_fs.py +0 -0
  177. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/sandbox_fs.pyi +0 -0
  178. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/schedule.py +0 -0
  179. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/scheduler_placement.py +0 -0
  180. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/secret.py +0 -0
  181. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/secret.pyi +0 -0
  182. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/server.py +0 -0
  183. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/server.pyi +0 -0
  184. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/serving.py +0 -0
  185. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/serving.pyi +0 -0
  186. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/skills/modal/SKILL.md +0 -0
  187. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/snapshot.py +0 -0
  188. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/snapshot.pyi +0 -0
  189. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/stream_type.py +0 -0
  190. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/token_flow.py +0 -0
  191. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/token_flow.pyi +0 -0
  192. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/volume.py +0 -0
  193. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/volume.pyi +0 -0
  194. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/workspace.py +0 -0
  195. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal/workspace.pyi +0 -0
  196. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/SOURCES.txt +0 -0
  197. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/dependency_links.txt +0 -0
  198. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/entry_points.txt +0 -0
  199. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/requires.txt +0 -0
  200. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal.egg-info/top_level.txt +0 -0
  201. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/__init__.py +0 -0
  202. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/gen_cli_docs.py +0 -0
  203. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/gen_cli_docs_main.py +0 -0
  204. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/gen_reference_docs.py +0 -0
  205. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/gen_reference_docs_main.py +0 -0
  206. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/mdmd/__init__.py +0 -0
  207. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/mdmd/mdmd.py +0 -0
  208. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/mdmd/signatures.py +0 -0
  209. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_docs/mdmd/types.py +0 -0
  210. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/__init__.py +0 -0
  211. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/api_grpc.py +0 -0
  212. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/api_pb2_grpc.py +0 -0
  213. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/api_pb2_grpc.pyi +0 -0
  214. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/modal_api_grpc.py +0 -0
  215. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/py.typed +0 -0
  216. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/task_command_router_grpc.py +0 -0
  217. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/task_command_router_pb2.py +0 -0
  218. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/task_command_router_pb2.pyi +0 -0
  219. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  220. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  221. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/modal_version/__main__.py +0 -0
  222. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/pyproject.toml +0 -0
  223. {modal-1.4.4.dev18 → modal-1.4.4.dev20}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.4.dev18
3
+ Version: 1.4.4.dev20
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -40,6 +40,7 @@ from ._utils.docker_utils import (
40
40
  )
41
41
  from ._utils.function_utils import FunctionInfo, parse_gpu_config
42
42
  from ._utils.mount_utils import validate_only_modal_volumes, validate_volumes_by_object_id
43
+ from ._utils.name_utils import check_object_name
43
44
  from .client import _Client
44
45
  from .cloud_bucket_mount import _CloudBucketMount
45
46
  from .config import config, logger, user_config_path
@@ -103,6 +104,27 @@ See https://modal.com/docs/guide/modal-1-0-migration for more details.
103
104
  P = typing_extensions.ParamSpec("P")
104
105
 
105
106
 
107
+ def _validate_image_name(name: str) -> None:
108
+ check_object_name(name, "Image")
109
+ # Reserve the "im-" prefix for image IDs so CLI args can be parsed
110
+ # unambiguously as either an image ID or an image name.
111
+ if name.startswith("im-"):
112
+ raise InvalidError("Image name cannot start with 'im-' (reserved for image IDs).")
113
+
114
+
115
+ def _validate_image_tag(tag: str) -> None:
116
+ check_object_name(tag, "Image tag")
117
+
118
+
119
+ def _parse_named_image_ref(name: str) -> str:
120
+ image_name, sep, tag = name.partition(":")
121
+ if not sep:
122
+ tag = "latest"
123
+ _validate_image_name(image_name)
124
+ _validate_image_tag(tag)
125
+ return f"{image_name}:{tag}"
126
+
127
+
106
128
  def _validate_python_version(
107
129
  python_version: str | None,
108
130
  builder_version: ImageBuilderVersion,
@@ -2844,6 +2866,86 @@ class _Image(_Object, type_prefix="im"):
2844
2866
  if task_log.data:
2845
2867
  yield task_log.data
2846
2868
 
2869
+ @staticmethod
2870
+ def from_name(
2871
+ name: str,
2872
+ *,
2873
+ environment_name: str | None = None,
2874
+ client: _Client | None = None,
2875
+ ) -> "_Image":
2876
+ """Reference a named Image that was previously published with `.publish()`.
2877
+
2878
+ Names can contain an optional `:tag` part - if no tag part is included `":latest"` is used,
2879
+ matching Docker conventions.
2880
+
2881
+ ```python notest
2882
+ image = modal.Image.from_name("my-image") # references my-image:latest
2883
+ image_v1 = modal.Image.from_name("my-image:v1")
2884
+
2885
+ @app.function(image=image)
2886
+ def run():
2887
+ ...
2888
+ ```
2889
+ """
2890
+ tag = _parse_named_image_ref(name)
2891
+
2892
+ async def _load(self: _Image, resolver: Resolver, load_context: LoadContext, existing_object_id: str | None):
2893
+ req = api_pb2.ImageGetByTagRequest(
2894
+ tag=tag,
2895
+ environment_name=load_context.environment_name,
2896
+ )
2897
+ response = await load_context.client.stub.ImageGetByTag(req)
2898
+ self._hydrate(response.image_id, load_context.client, None)
2899
+
2900
+ rep = _Image._repr(tag, environment_name)
2901
+ return _Image._from_loader(
2902
+ _load,
2903
+ rep,
2904
+ hydrate_lazily=True,
2905
+ skip_reload=True,
2906
+ load_context_overrides=LoadContext(environment_name=environment_name, client=client),
2907
+ )
2908
+
2909
+ async def publish(
2910
+ self,
2911
+ name: str,
2912
+ *,
2913
+ environment_name: str | None = None,
2914
+ client: _Client | None = None,
2915
+ ) -> None:
2916
+ """Publish this image under the given name
2917
+
2918
+ The Image must already be created (typically by calling `image.build()` or `sandbox.snapshot_filesystem()`).
2919
+
2920
+ Image names can contain an explicit tag designation (using the `name:tag`). If no tag is included in the name,
2921
+ `":latest"` is used, matching Docker conventions. To publish multiple tags, call `.publish()` once per tag.
2922
+
2923
+ ```python notest
2924
+ image = modal.Image.debian_slim().pip_install("numpy")
2925
+ image.build(app)
2926
+ image.publish("my-image-with-numpy") # my-image-with-numpy:latest
2927
+ image.publish("my-image-with-numpy:v1")
2928
+ ```
2929
+ """
2930
+ tag = _parse_named_image_ref(name)
2931
+
2932
+ if not self.is_hydrated:
2933
+ raise InvalidError("Cannot publish an image that has not been created yet. Call `.build()` first.")
2934
+
2935
+ _client = client or self._client
2936
+ assert _client is not None
2937
+
2938
+ resolved_env = environment_name or config.get("environment") or ""
2939
+
2940
+ await _client.stub.ImagePublish(
2941
+ api_pb2.ImagePublishRequest(
2942
+ image_id=self.object_id,
2943
+ environment_name=resolved_env,
2944
+ is_public=False,
2945
+ tag=tag,
2946
+ )
2947
+ )
2948
+
2847
2949
  async def hydrate(self, client: _Client | None = None) -> Self:
2848
2950
  """mdmd:hidden"""
2849
2951
  # Image inherits hydrate() from Object but can't be hydrated on demand
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.4.4.dev18",
38
+ version: str = "1.4.4.dev20",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.4.4.dev18",
208
+ version: str = "1.4.4.dev20",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -465,7 +465,7 @@ class Function(
465
465
 
466
466
  _call_generator: ___call_generator_spec
467
467
 
468
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
468
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
469
469
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
470
470
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
471
471
 
@@ -490,7 +490,7 @@ class Function(
490
490
  """
491
491
  ...
492
492
 
493
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
493
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
494
494
 
495
495
  class __remote_gen_spec(typing_extensions.Protocol):
496
496
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -540,7 +540,7 @@ class Function(
540
540
  """
541
541
  ...
542
542
 
543
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
543
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
544
544
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
545
545
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
546
546
 
@@ -573,7 +573,7 @@ class Function(
573
573
  """
574
574
  ...
575
575
 
576
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
576
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
577
577
 
578
578
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
579
579
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -581,7 +581,7 @@ class Function(
581
581
 
582
582
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
583
583
 
584
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
584
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
585
585
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
586
586
  """Calls the function with the given arguments, without waiting for the results.
587
587
 
@@ -614,7 +614,7 @@ class Function(
614
614
  """
615
615
  ...
616
616
 
617
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
617
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
618
618
 
619
619
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
620
620
  """Return the inner Python object wrapped by this Modal Function.
@@ -1356,6 +1356,77 @@ class Image(modal.object.Object):
1356
1356
 
1357
1357
  _logs: ___logs_spec
1358
1358
 
1359
+ @staticmethod
1360
+ def from_name(
1361
+ name: str, *, environment_name: typing.Optional[str] = None, client: typing.Optional[modal.client.Client] = None
1362
+ ) -> Image:
1363
+ """Reference a named Image that was previously published with `.publish()`.
1364
+
1365
+ Names can contain an optional `:tag` part - if no tag part is included `":latest"` is used,
1366
+ matching Docker conventions.
1367
+
1368
+ ```python notest
1369
+ image = modal.Image.from_name("my-image") # references my-image:latest
1370
+ image_v1 = modal.Image.from_name("my-image:v1")
1371
+
1372
+ @app.function(image=image)
1373
+ def run():
1374
+ ...
1375
+ ```
1376
+ """
1377
+ ...
1378
+
1379
+ class __publish_spec(typing_extensions.Protocol):
1380
+ def __call__(
1381
+ self,
1382
+ /,
1383
+ name: str,
1384
+ *,
1385
+ environment_name: typing.Optional[str] = None,
1386
+ client: typing.Optional[modal.client.Client] = None,
1387
+ ) -> None:
1388
+ """Publish this image under the given name
1389
+
1390
+ The Image must already be created (typically by calling `image.build()` or `sandbox.snapshot_filesystem()`).
1391
+
1392
+ Image names can contain an explicit tag designation (using the `name:tag`). If no tag is included in the name,
1393
+ `":latest"` is used, matching Docker conventions. To publish multiple tags, call `.publish()` once per tag.
1394
+
1395
+ ```python notest
1396
+ image = modal.Image.debian_slim().pip_install("numpy")
1397
+ image.build(app)
1398
+ image.publish("my-image-with-numpy") # my-image-with-numpy:latest
1399
+ image.publish("my-image-with-numpy:v1")
1400
+ ```
1401
+ """
1402
+ ...
1403
+
1404
+ async def aio(
1405
+ self,
1406
+ /,
1407
+ name: str,
1408
+ *,
1409
+ environment_name: typing.Optional[str] = None,
1410
+ client: typing.Optional[modal.client.Client] = None,
1411
+ ) -> None:
1412
+ """Publish this image under the given name
1413
+
1414
+ The Image must already be created (typically by calling `image.build()` or `sandbox.snapshot_filesystem()`).
1415
+
1416
+ Image names can contain an explicit tag designation (using the `name:tag`). If no tag is included in the name,
1417
+ `":latest"` is used, matching Docker conventions. To publish multiple tags, call `.publish()` once per tag.
1418
+
1419
+ ```python notest
1420
+ image = modal.Image.debian_slim().pip_install("numpy")
1421
+ image.build(app)
1422
+ image.publish("my-image-with-numpy") # my-image-with-numpy:latest
1423
+ image.publish("my-image-with-numpy:v1")
1424
+ ```
1425
+ """
1426
+ ...
1427
+
1428
+ publish: __publish_spec
1429
+
1359
1430
  class __hydrate_spec(typing_extensions.Protocol[SUPERSELF]):
1360
1431
  def __call__(self, /, client: typing.Optional[modal.client.Client] = None) -> SUPERSELF:
1361
1432
  """mdmd:hidden"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.4.dev18
3
+ Version: 1.4.4.dev20
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0