modal 1.5.6.dev31__tar.gz → 1.6.1.dev0__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 (242) hide show
  1. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/PKG-INFO +1 -1
  2. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_functions.py +4 -4
  3. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_object.py +17 -9
  4. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_partial_function.py +1 -1
  5. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_server.py +11 -9
  6. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_server.pyi +23 -17
  7. modal-1.6.1.dev0/modal/cli/endpoint.py +779 -0
  8. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/server.py +170 -107
  9. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/client.pyi +2 -2
  10. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/dict.py +4 -4
  11. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/dict.pyi +9 -9
  12. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/functions.pyi +12 -10
  13. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/network_file_system.py +3 -3
  14. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/network_file_system.pyi +6 -6
  15. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/object.pyi +1 -1
  16. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/parallel_map.py +4 -4
  17. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/parallel_map.pyi +3 -3
  18. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/partial_function.pyi +1 -1
  19. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/sandbox.py +15 -0
  20. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/sandbox.pyi +12 -0
  21. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/server.pyi +1 -1
  22. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/token_flow.py +2 -1
  23. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/types.py +4 -1
  24. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/volume.py +2 -2
  25. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/volume.pyi +9 -3
  26. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/PKG-INFO +1 -1
  27. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_version/__init__.py +1 -1
  28. modal-1.5.6.dev31/modal/cli/endpoint.py +0 -372
  29. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/LICENSE +0 -0
  30. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/README.md +0 -0
  31. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/__init__.py +0 -0
  32. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/__main__.py +0 -0
  33. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_billing.py +0 -0
  34. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_cluster.py +0 -0
  35. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_cluster.pyi +0 -0
  36. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_container_entrypoint.py +0 -0
  37. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_environments.py +0 -0
  38. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_function_variants.py +0 -0
  39. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_grpc_client.py +0 -0
  40. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_image.py +0 -0
  41. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_ipython.py +0 -0
  42. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_load_context.py +0 -0
  43. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_location.py +0 -0
  44. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_logs.py +0 -0
  45. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_logs_manager.py +0 -0
  46. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_logs_manager.pyi +0 -0
  47. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_outbound_policy.py +0 -0
  48. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_outbound_policy.pyi +0 -0
  49. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_output/__init__.py +0 -0
  50. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_output/manager.py +0 -0
  51. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_output/pty.py +0 -0
  52. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_output/rich.py +0 -0
  53. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_output/status.py +0 -0
  54. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_resolver.py +0 -0
  55. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_resources.py +0 -0
  56. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/__init__.py +0 -0
  57. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/asgi.py +0 -0
  58. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/container_io_manager.py +0 -0
  59. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/container_io_manager.pyi +0 -0
  60. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/execution_context.py +0 -0
  61. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/execution_context.pyi +0 -0
  62. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  63. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/task_lifecycle_manager.py +0 -0
  64. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  65. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/telemetry.py +0 -0
  66. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/user_code_event_loop.py +0 -0
  67. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_runtime/user_code_imports.py +0 -0
  68. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_serialization.py +0 -0
  69. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_supports_logs.py +0 -0
  70. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_traceback.py +0 -0
  71. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_tunnel.py +0 -0
  72. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_tunnel.pyi +0 -0
  73. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_type_manager.py +0 -0
  74. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/__init__.py +0 -0
  75. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/app_utils.py +0 -0
  76. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/async_utils.py +0 -0
  77. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/auth_token_manager.py +0 -0
  78. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/blob_utils.py +0 -0
  79. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/browser_utils.py +0 -0
  80. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/bytes_io_segment_payload.py +0 -0
  81. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/curl_utils.py +0 -0
  82. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/deprecation.py +0 -0
  83. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/display_utils.py +0 -0
  84. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/docker_utils.py +0 -0
  85. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/function_utils.py +0 -0
  86. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/git_utils.py +0 -0
  87. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/grpc_testing.py +0 -0
  88. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/grpc_utils.py +0 -0
  89. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/hash_utils.py +0 -0
  90. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/http_utils.py +0 -0
  91. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/idle_countdown.py +0 -0
  92. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/jwt_utils.py +0 -0
  93. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/logger.py +0 -0
  94. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/mount_utils.py +0 -0
  95. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/name_utils.py +0 -0
  96. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/package_utils.py +0 -0
  97. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/pattern_utils.py +0 -0
  98. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/proxy_support.py +0 -0
  99. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/rand_pb_testing.py +0 -0
  100. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/sandbox_fs_utils.py +0 -0
  101. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/shell_utils.py +0 -0
  102. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/task_command_router_client.py +0 -0
  103. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_utils/time_utils.py +0 -0
  104. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_vendor/__init__.py +0 -0
  105. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  106. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_vendor/cloudpickle.py +0 -0
  107. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_vendor/tblib.py +0 -0
  108. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_vendor/version.py +0 -0
  109. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_watcher.py +0 -0
  110. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/_workspace.py +0 -0
  111. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/app.py +0 -0
  112. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/app.pyi +0 -0
  113. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/billing.py +0 -0
  114. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/billing.pyi +0 -0
  115. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/2023.12.312.txt +0 -0
  116. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/2023.12.txt +0 -0
  117. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/2024.04.txt +0 -0
  118. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/2024.10.txt +0 -0
  119. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/2025.06.txt +0 -0
  120. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/PREVIEW.txt +0 -0
  121. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/README.md +0 -0
  122. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/builder/base-images.json +0 -0
  123. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/call_graph.py +0 -0
  124. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/__init__.py +0 -0
  125. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/_download.py +0 -0
  126. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/_help.py +0 -0
  127. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/_logs.py +0 -0
  128. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/_stats.py +0 -0
  129. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/_traceback.py +0 -0
  130. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/app.py +0 -0
  131. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/billing.py +0 -0
  132. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/changelog.py +0 -0
  133. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/config.py +0 -0
  134. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/container.py +0 -0
  135. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/curl.py +0 -0
  136. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/dashboard.py +0 -0
  137. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/dict.py +0 -0
  138. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/entry_point.py +0 -0
  139. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/environment.py +0 -0
  140. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/function.py +0 -0
  141. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/image.py +0 -0
  142. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/import_refs.py +0 -0
  143. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/logo.py +0 -0
  144. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/network_file_system.py +0 -0
  145. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/profile.py +0 -0
  146. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/queues.py +0 -0
  147. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/run.py +0 -0
  148. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/secret.py +0 -0
  149. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/selector.py +0 -0
  150. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/shell.py +0 -0
  151. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/skills.py +0 -0
  152. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/token.py +0 -0
  153. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/utils.py +0 -0
  154. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/volume.py +0 -0
  155. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cli/workspace.py +0 -0
  156. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/client.py +0 -0
  157. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cloud_bucket_mount.py +0 -0
  158. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cloud_bucket_mount.pyi +0 -0
  159. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cls.py +0 -0
  160. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cls.pyi +0 -0
  161. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cluster.py +0 -0
  162. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/cluster.pyi +0 -0
  163. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/config.py +0 -0
  164. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/container_process.py +0 -0
  165. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/container_process.pyi +0 -0
  166. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/environments.py +0 -0
  167. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/environments.pyi +0 -0
  168. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/exception.py +0 -0
  169. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/__init__.py +0 -0
  170. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/_flash_container_entry.py +0 -0
  171. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/flash.py +0 -0
  172. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/flash.pyi +0 -0
  173. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/flash_server.py +0 -0
  174. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/flash_server.pyi +0 -0
  175. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/experimental/ipython.py +0 -0
  176. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/file_pattern_matcher.py +0 -0
  177. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/functions.py +0 -0
  178. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/image.py +0 -0
  179. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/image.pyi +0 -0
  180. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/io_streams.py +0 -0
  181. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/io_streams.pyi +0 -0
  182. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/mount.py +0 -0
  183. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/mount.pyi +0 -0
  184. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/object.py +0 -0
  185. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/output.py +0 -0
  186. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/partial_function.py +0 -0
  187. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/proxy.py +0 -0
  188. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/proxy.pyi +0 -0
  189. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/py.typed +0 -0
  190. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/queue.py +0 -0
  191. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/queue.pyi +0 -0
  192. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/retries.py +0 -0
  193. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/runner.py +0 -0
  194. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/runner.pyi +0 -0
  195. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/running_app.py +0 -0
  196. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/sandbox_fs.py +0 -0
  197. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/sandbox_fs.pyi +0 -0
  198. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/schedule.py +0 -0
  199. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/scheduler_placement.py +0 -0
  200. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/secret.py +0 -0
  201. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/secret.pyi +0 -0
  202. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/server.py +0 -0
  203. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/serving.py +0 -0
  204. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/serving.pyi +0 -0
  205. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/skills/modal/SKILL.md +0 -0
  206. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/snapshot.py +0 -0
  207. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/snapshot.pyi +0 -0
  208. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/stream_type.py +0 -0
  209. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/token_flow.pyi +0 -0
  210. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/workspace.py +0 -0
  211. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal/workspace.pyi +0 -0
  212. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/SOURCES.txt +0 -0
  213. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/dependency_links.txt +0 -0
  214. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/entry_points.txt +0 -0
  215. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/requires.txt +0 -0
  216. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal.egg-info/top_level.txt +0 -0
  217. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/__init__.py +0 -0
  218. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/gen_cli_docs.py +0 -0
  219. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/gen_cli_docs_main.py +0 -0
  220. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/gen_reference_docs.py +0 -0
  221. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/gen_reference_docs_main.py +0 -0
  222. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/mdmd/__init__.py +0 -0
  223. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/mdmd/mdmd.py +0 -0
  224. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/mdmd/signatures.py +0 -0
  225. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/mdmd/types.py +0 -0
  226. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_docs/reference_intro.md +0 -0
  227. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/__init__.py +0 -0
  228. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/api_grpc.py +0 -0
  229. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/api_pb2.py +0 -0
  230. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/api_pb2.pyi +0 -0
  231. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/api_pb2_grpc.py +0 -0
  232. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/api_pb2_grpc.pyi +0 -0
  233. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/modal_api_grpc.py +0 -0
  234. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/py.typed +0 -0
  235. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/task_command_router_grpc.py +0 -0
  236. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/task_command_router_pb2.py +0 -0
  237. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/task_command_router_pb2.pyi +0 -0
  238. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  239. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  240. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/modal_version/__main__.py +0 -0
  241. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/pyproject.toml +0 -0
  242. {modal-1.5.6.dev31 → modal-1.6.1.dev0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.6.dev31
3
+ Version: 1.6.1.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -7,7 +7,7 @@ import time
7
7
  import typing
8
8
  import warnings
9
9
  from collections import OrderedDict
10
- from collections.abc import AsyncGenerator, AsyncIterator, Callable, Collection, Sequence
10
+ from collections.abc import AsyncGenerator, Callable, Collection, Sequence
11
11
  from dataclasses import dataclass
12
12
  from datetime import datetime, timedelta, timezone
13
13
  from pathlib import PurePosixPath
@@ -1749,14 +1749,14 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1749
1749
  return list(self._experimental_flash_urls) if self._experimental_flash_urls else None
1750
1750
 
1751
1751
  async def _fetch_flash_auth_token(self, retry: Retry) -> str:
1752
- resp = await self.client.stub.FunctionGetFlashAuthToken(
1752
+ resp = await self.client._stub.FunctionGetFlashAuthToken(
1753
1753
  api_pb2.FunctionGetFlashAuthTokenRequest(function_id=self.object_id), retry=retry
1754
1754
  )
1755
1755
  return resp.token
1756
1756
 
1757
1757
  async def _get_flash_auth_token(self) -> str:
1758
1758
  if self._flash_token_manager is None:
1759
- self._flash_token_manager = _AuthTokenManager(self.client.stub, fetch=self._fetch_flash_auth_token)
1759
+ self._flash_token_manager = _AuthTokenManager(self.client._stub, fetch=self._fetch_flash_auth_token)
1760
1760
  return await self._flash_token_manager.get_token()
1761
1761
 
1762
1762
  def _apply_dynamic_config(
@@ -2405,7 +2405,7 @@ class _FunctionCall(typing.Generic[ReturnType], _Object, type_prefix="fc"):
2405
2405
  return await self._invocation().poll_function(timeout=timeout, index=index)
2406
2406
 
2407
2407
  @live_method_gen
2408
- async def iter(self, *, start: int = 0, end: int | None = None) -> AsyncIterator[ReturnType]:
2408
+ async def iter(self, *, start: int = 0, end: int | None = None) -> AsyncGenerator[ReturnType, None]:
2409
2409
  """Iterate in-order over the results of the function call.
2410
2410
 
2411
2411
  Optionally, specify a range [start, end) to iterate over.
@@ -4,10 +4,10 @@ import typing
4
4
  import uuid
5
5
  from collections.abc import Awaitable, Callable, Hashable, Sequence
6
6
  from functools import wraps
7
- from typing import ClassVar
7
+ from typing import Any, AsyncContextManager, AsyncGenerator, AsyncIterator, ClassVar, ParamSpec, TypeVar
8
8
 
9
9
  from google.protobuf.message import Message
10
- from typing_extensions import Self
10
+ from typing_extensions import Concatenate, Self
11
11
 
12
12
  from ._load_context import LoadContext
13
13
  from ._resolver import Resolver
@@ -38,18 +38,24 @@ def _get_environment_name(
38
38
  return config.get("environment") or ""
39
39
 
40
40
 
41
- def live_method(method):
41
+ P = ParamSpec("P")
42
+ T = TypeVar("T")
43
+
44
+
45
+ def live_method(method: Callable[Concatenate[Any, P], Awaitable[T]]) -> Callable[Concatenate[Any, P], Awaitable[T]]:
42
46
  @wraps(method)
43
- async def wrapped(self, *args, **kwargs):
47
+ async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> T:
44
48
  await self.hydrate()
45
49
  return await method(self, *args, **kwargs)
46
50
 
47
51
  return wrapped
48
52
 
49
53
 
50
- def live_method_gen(method):
54
+ def live_method_gen(
55
+ method: Callable[Concatenate[Any, P], AsyncGenerator[T, None]],
56
+ ) -> Callable[Concatenate[Any, P], AsyncIterator[T]]:
51
57
  @wraps(method)
52
- async def wrapped(self, *args, **kwargs):
58
+ async def wrapped(self, *args: P.args, **kwargs: P.kwargs) -> AsyncIterator[T]:
53
59
  await self.hydrate()
54
60
  async with aclosing(method(self, *args, **kwargs)) as stream:
55
61
  async for item in stream:
@@ -58,14 +64,16 @@ def live_method_gen(method):
58
64
  return wrapped
59
65
 
60
66
 
61
- def live_method_contextmanager(method):
67
+ def live_method_contextmanager(
68
+ method: Callable[Concatenate[Any, P], AsyncContextManager[T]],
69
+ ) -> Callable[Concatenate[Any, P], AsyncContextManager[T]]:
62
70
  # make sure a wrapped function returning an async context manager
63
71
  # will not require both an `await func.aio()` and `async with`
64
72
  # which would have been the case if it was wrapped in live_method
65
73
 
66
74
  @wraps(method)
67
75
  @contextlib.asynccontextmanager
68
- async def wrapped(self, *args, **kwargs):
76
+ async def wrapped(self, *args: P.args, **kwargs: P.kwargs):
69
77
  await self.hydrate()
70
78
  async with method(self, *args, **kwargs) as ctx:
71
79
  yield ctx
@@ -75,7 +83,7 @@ def live_method_contextmanager(method):
75
83
 
76
84
  class _Object:
77
85
  _type_prefix: ClassVar[str | None] = None
78
- _prefix_to_type: ClassVar[dict[str, type]] = {}
86
+ _prefix_to_type: ClassVar[dict[str, type["_Object"]]] = {}
79
87
 
80
88
  # For constructors
81
89
  _load: Callable[[Self, Resolver, LoadContext, str | None], Awaitable[None]] | None = None
@@ -732,7 +732,7 @@ def _sessioned() -> Callable[
732
732
  [Callable[P, ReturnType] | _PartialFunction[P, ReturnType, ReturnType]],
733
733
  _PartialFunction[P, ReturnType, ReturnType],
734
734
  ]:
735
- """Decorator that enables sessions on a Server.
735
+ """Decorator that enables sticky sessions on a Server.
736
736
 
737
737
  Every request must carry a session token obtained from a session start request; requests with the same token are
738
738
  routed to the same container until the session is idle for `idle_timeout` seconds or explicitly terminated. A
@@ -113,7 +113,7 @@ class _Server:
113
113
 
114
114
  @property
115
115
  def sessions(self) -> "_ServerSessionsManager":
116
- """Start and terminate sessions on a Server decorated with `@modal.sessioned()`."""
116
+ """Start and terminate sticky sessions on a Server decorated with `@modal.sessioned()`."""
117
117
  return _ServerSessionsManager(self)
118
118
 
119
119
  async def info(self, *, refresh: bool = False) -> ServerInfo:
@@ -160,7 +160,7 @@ class _Server:
160
160
  This interface is experimental and may change or be removed without warning.
161
161
  """
162
162
  service_function = self._get_service_function()
163
- response = await service_function.client.stub.FlashContainerList(
163
+ response = await service_function.client._stub.FlashContainerList(
164
164
  api_pb2.FlashContainerListRequest(function_id=service_function.object_id)
165
165
  )
166
166
  return [
@@ -473,13 +473,13 @@ class _Server:
473
473
  request.until.FromDatetime(until)
474
474
  if container:
475
475
  request.container_id = container
476
- stats = await self._get_service_function().client.stub.ServerGetTimeRangeStats(request)
476
+ stats = await self._get_service_function().client._stub.ServerGetTimeRangeStats(request)
477
477
  return ServerStats._from_proto(stats)
478
478
 
479
479
 
480
480
  @retry(n_attempts=5, base_delay=0.5, attempt_timeout=65, total_timeout=200)
481
481
  async def _post_session_control(url: str, headers: dict[str, str]) -> tuple[int, str, str]:
482
- """POST to a session control endpoint, retrying connection errors and 5xx. Returns (status, reason, body)."""
482
+ """POST to a sticky session control endpoint, retrying connection errors and 5xx. Returns (status, reason, body)."""
483
483
  async with ClientSessionRegistry.get_session().post(url, headers=headers) as resp:
484
484
  body = await resp.text()
485
485
  if resp.status >= 400:
@@ -501,11 +501,11 @@ class _ServerSessionsManager:
501
501
  raise InvalidError("`sessions` requires `@modal.sessioned()` on the Server.")
502
502
 
503
503
  async def start(self, idle_timeout: int = 600) -> ServerSessionCredentials:
504
- """Start a session and return its ID and token.
504
+ """Start a sticky session and return its ID and token.
505
505
 
506
- Requests to the server URL that carry the returned token are routed to the same container until the session
507
- has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down for as long
508
- as it holds a live session.
506
+ Requests to the server URL that carry the returned token are routed to the same container until the
507
+ session has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down
508
+ for as long as it holds a live session.
509
509
 
510
510
  Args:
511
511
  idle_timeout: Seconds without an in-flight request before the session ends.
@@ -550,7 +550,9 @@ class _ServerSessionsManager:
550
550
  raise ExecutionError("Failed to start session: unexpected response from server") from None
551
551
 
552
552
  async def terminate(self, token: str) -> None:
553
- """Terminate a session. New requests to it will be rejected. Container will continue serving other sessions.
553
+ """Terminate a sticky session.
554
+
555
+ New requests to it will be rejected. The container continues serving other sessions.
554
556
 
555
557
  Args:
556
558
  token: The `token` of the `ServerSessionCredentials` to terminate.
@@ -67,7 +67,7 @@ class _Server:
67
67
 
68
68
  @property
69
69
  def sessions(self) -> _ServerSessionsManager:
70
- """Start and terminate sessions on a Server decorated with `@modal.sessioned()`."""
70
+ """Start and terminate sticky sessions on a Server decorated with `@modal.sessioned()`."""
71
71
  ...
72
72
 
73
73
  async def info(self, *, refresh: bool = False) -> modal.types.ServerInfo:
@@ -272,7 +272,7 @@ class _Server:
272
272
  ...
273
273
 
274
274
  async def _post_session_control(url: str, headers: dict[str, str]) -> tuple[int, str, str]:
275
- """POST to a session control endpoint, retrying connection errors and 5xx. Returns (status, reason, body)."""
275
+ """POST to a sticky session control endpoint, retrying connection errors and 5xx. Returns (status, reason, body)."""
276
276
  ...
277
277
 
278
278
  class _ServerSessionsManager:
@@ -283,11 +283,11 @@ class _ServerSessionsManager:
283
283
 
284
284
  def _validate(self) -> None: ...
285
285
  async def start(self, idle_timeout: int = 600) -> modal.types.ServerSessionCredentials:
286
- """Start a session and return its ID and token.
286
+ """Start a sticky session and return its ID and token.
287
287
 
288
- Requests to the server URL that carry the returned token are routed to the same container until the session
289
- has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down for as long
290
- as it holds a live session.
288
+ Requests to the server URL that carry the returned token are routed to the same container until the
289
+ session has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down
290
+ for as long as it holds a live session.
291
291
 
292
292
  Args:
293
293
  idle_timeout: Seconds without an in-flight request before the session ends.
@@ -308,7 +308,9 @@ class _ServerSessionsManager:
308
308
  ...
309
309
 
310
310
  async def terminate(self, token: str) -> None:
311
- """Terminate a session. New requests to it will be rejected. Container will continue serving other sessions.
311
+ """Terminate a sticky session.
312
+
313
+ New requests to it will be rejected. The container continues serving other sessions.
312
314
 
313
315
  Args:
314
316
  token: The `token` of the `ServerSessionCredentials` to terminate.
@@ -334,11 +336,11 @@ class ServerSessionsManager:
334
336
 
335
337
  class __start_spec(typing_extensions.Protocol):
336
338
  def __call__(self, /, idle_timeout: int = 600) -> modal.types.ServerSessionCredentials:
337
- """Start a session and return its ID and token.
339
+ """Start a sticky session and return its ID and token.
338
340
 
339
- Requests to the server URL that carry the returned token are routed to the same container until the session
340
- has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down for as long
341
- as it holds a live session.
341
+ Requests to the server URL that carry the returned token are routed to the same container until the
342
+ session has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down
343
+ for as long as it holds a live session.
342
344
 
343
345
  Args:
344
346
  idle_timeout: Seconds without an in-flight request before the session ends.
@@ -359,11 +361,11 @@ class ServerSessionsManager:
359
361
  ...
360
362
 
361
363
  async def aio(self, /, idle_timeout: int = 600) -> modal.types.ServerSessionCredentials:
362
- """Start a session and return its ID and token.
364
+ """Start a sticky session and return its ID and token.
363
365
 
364
- Requests to the server URL that carry the returned token are routed to the same container until the session
365
- has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down for as long
366
- as it holds a live session.
366
+ Requests to the server URL that carry the returned token are routed to the same container until the
367
+ session has had no connections for `idle_timeout` seconds or is terminated. A container won't be scaled down
368
+ for as long as it holds a live session.
367
369
 
368
370
  Args:
369
371
  idle_timeout: Seconds without an in-flight request before the session ends.
@@ -387,7 +389,9 @@ class ServerSessionsManager:
387
389
 
388
390
  class __terminate_spec(typing_extensions.Protocol):
389
391
  def __call__(self, /, token: str) -> None:
390
- """Terminate a session. New requests to it will be rejected. Container will continue serving other sessions.
392
+ """Terminate a sticky session.
393
+
394
+ New requests to it will be rejected. The container continues serving other sessions.
391
395
 
392
396
  Args:
393
397
  token: The `token` of the `ServerSessionCredentials` to terminate.
@@ -404,7 +408,9 @@ class ServerSessionsManager:
404
408
  ...
405
409
 
406
410
  async def aio(self, /, token: str) -> None:
407
- """Terminate a session. New requests to it will be rejected. Container will continue serving other sessions.
411
+ """Terminate a sticky session.
412
+
413
+ New requests to it will be rejected. The container continues serving other sessions.
408
414
 
409
415
  Args:
410
416
  token: The `token` of the `ServerSessionCredentials` to terminate.