modAL 1.3.1.dev9__tar.gz → 1.3.1.dev11__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 (194) hide show
  1. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/PKG-INFO +1 -1
  2. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_partial_function.py +1 -22
  3. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/app.py +0 -6
  4. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/client.pyi +2 -2
  5. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cls.py +0 -3
  6. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/partial_function.pyi +0 -1
  7. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api.proto +30 -1
  9. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api_grpc.py +16 -0
  10. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api_pb2.py +263 -223
  11. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api_pb2.pyi +87 -0
  12. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api_pb2_grpc.py +33 -0
  13. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/api_pb2_grpc.pyi +10 -0
  14. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/modal_api_grpc.py +1 -0
  15. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_version/__init__.py +1 -1
  16. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/LICENSE +0 -0
  17. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/README.md +0 -0
  18. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/__init__.py +0 -0
  19. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/__main__.py +0 -0
  20. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_billing.py +0 -0
  21. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_clustered_functions.py +0 -0
  22. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_clustered_functions.pyi +0 -0
  23. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_container_entrypoint.py +0 -0
  24. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_functions.py +0 -0
  25. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_grpc_client.py +0 -0
  26. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_ipython.py +0 -0
  27. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_load_context.py +0 -0
  28. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_location.py +0 -0
  29. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_object.py +0 -0
  30. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_output.py +0 -0
  31. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_pty.py +0 -0
  32. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_resolver.py +0 -0
  33. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_resources.py +0 -0
  34. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/__init__.py +0 -0
  35. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/asgi.py +0 -0
  36. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/container_io_manager.py +0 -0
  37. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/container_io_manager.pyi +0 -0
  38. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/execution_context.py +0 -0
  39. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/execution_context.pyi +0 -0
  40. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  41. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/telemetry.py +0 -0
  42. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/user_code_event_loop.py +0 -0
  43. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_runtime/user_code_imports.py +0 -0
  44. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_serialization.py +0 -0
  45. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_traceback.py +0 -0
  46. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_tunnel.py +0 -0
  47. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_tunnel.pyi +0 -0
  48. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_type_manager.py +0 -0
  49. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/__init__.py +0 -0
  50. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/app_utils.py +0 -0
  51. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/async_utils.py +0 -0
  52. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/auth_token_manager.py +0 -0
  53. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/blob_utils.py +0 -0
  54. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/bytes_io_segment_payload.py +0 -0
  55. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/deprecation.py +0 -0
  56. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/docker_utils.py +0 -0
  57. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/function_utils.py +0 -0
  58. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/git_utils.py +0 -0
  59. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/grpc_testing.py +0 -0
  60. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/grpc_utils.py +0 -0
  61. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/hash_utils.py +0 -0
  62. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/http_utils.py +0 -0
  63. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/jwt_utils.py +0 -0
  64. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/logger.py +0 -0
  65. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/mount_utils.py +0 -0
  66. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/name_utils.py +0 -0
  67. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/package_utils.py +0 -0
  68. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/pattern_utils.py +0 -0
  69. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/rand_pb_testing.py +0 -0
  70. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/shell_utils.py +0 -0
  71. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/task_command_router_client.py +0 -0
  72. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_utils/time_utils.py +0 -0
  73. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_vendor/__init__.py +0 -0
  74. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  75. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_vendor/cloudpickle.py +0 -0
  76. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_vendor/tblib.py +0 -0
  77. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/_watcher.py +0 -0
  78. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/app.pyi +0 -0
  79. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/billing.py +0 -0
  80. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/2023.12.312.txt +0 -0
  81. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/2023.12.txt +0 -0
  82. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/2024.04.txt +0 -0
  83. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/2024.10.txt +0 -0
  84. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/2025.06.txt +0 -0
  85. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/PREVIEW.txt +0 -0
  86. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/README.md +0 -0
  87. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/builder/base-images.json +0 -0
  88. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/call_graph.py +0 -0
  89. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/__init__.py +0 -0
  90. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/_download.py +0 -0
  91. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/_traceback.py +0 -0
  92. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/app.py +0 -0
  93. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/cluster.py +0 -0
  94. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/config.py +0 -0
  95. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/container.py +0 -0
  96. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/dict.py +0 -0
  97. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/entry_point.py +0 -0
  98. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/environment.py +0 -0
  99. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/import_refs.py +0 -0
  100. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/launch.py +0 -0
  101. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/network_file_system.py +0 -0
  102. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/profile.py +0 -0
  103. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/programs/__init__.py +0 -0
  104. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/programs/run_jupyter.py +0 -0
  105. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/programs/vscode.py +0 -0
  106. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/queues.py +0 -0
  107. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/run.py +0 -0
  108. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/secret.py +0 -0
  109. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/shell.py +0 -0
  110. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/token.py +0 -0
  111. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/utils.py +0 -0
  112. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cli/volume.py +0 -0
  113. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/client.py +0 -0
  114. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cloud_bucket_mount.py +0 -0
  115. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cloud_bucket_mount.pyi +0 -0
  116. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/cls.pyi +0 -0
  117. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/config.py +0 -0
  118. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/container_process.py +0 -0
  119. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/container_process.pyi +0 -0
  120. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/dict.py +0 -0
  121. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/dict.pyi +0 -0
  122. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/environments.py +0 -0
  123. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/environments.pyi +0 -0
  124. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/exception.py +0 -0
  125. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/experimental/__init__.py +0 -0
  126. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/experimental/flash.py +0 -0
  127. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/experimental/flash.pyi +0 -0
  128. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/experimental/ipython.py +0 -0
  129. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/file_io.py +0 -0
  130. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/file_io.pyi +0 -0
  131. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/file_pattern_matcher.py +0 -0
  132. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/functions.py +0 -0
  133. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/functions.pyi +0 -0
  134. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/gpu.py +0 -0
  135. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/image.py +0 -0
  136. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/image.pyi +0 -0
  137. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/io_streams.py +0 -0
  138. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/io_streams.pyi +0 -0
  139. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/mount.py +0 -0
  140. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/mount.pyi +0 -0
  141. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/network_file_system.py +0 -0
  142. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/network_file_system.pyi +0 -0
  143. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/object.py +0 -0
  144. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/object.pyi +0 -0
  145. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/output.py +0 -0
  146. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/parallel_map.py +0 -0
  147. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/parallel_map.pyi +0 -0
  148. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/partial_function.py +0 -0
  149. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/proxy.py +0 -0
  150. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/proxy.pyi +0 -0
  151. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/py.typed +0 -0
  152. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/queue.py +0 -0
  153. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/queue.pyi +0 -0
  154. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/retries.py +0 -0
  155. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/runner.py +0 -0
  156. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/runner.pyi +0 -0
  157. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/running_app.py +0 -0
  158. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/sandbox.py +0 -0
  159. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/sandbox.pyi +0 -0
  160. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/schedule.py +0 -0
  161. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/scheduler_placement.py +0 -0
  162. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/secret.py +0 -0
  163. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/secret.pyi +0 -0
  164. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/serving.py +0 -0
  165. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/serving.pyi +0 -0
  166. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/snapshot.py +0 -0
  167. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/snapshot.pyi +0 -0
  168. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/stream_type.py +0 -0
  169. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/token_flow.py +0 -0
  170. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/token_flow.pyi +0 -0
  171. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/volume.py +0 -0
  172. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal/volume.pyi +0 -0
  173. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/SOURCES.txt +0 -0
  174. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/dependency_links.txt +0 -0
  175. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/entry_points.txt +0 -0
  176. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/requires.txt +0 -0
  177. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal.egg-info/top_level.txt +0 -0
  178. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/__init__.py +0 -0
  179. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/gen_cli_docs.py +0 -0
  180. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/gen_reference_docs.py +0 -0
  181. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/mdmd/__init__.py +0 -0
  182. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/mdmd/mdmd.py +0 -0
  183. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_docs/mdmd/signatures.py +0 -0
  184. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/__init__.py +0 -0
  185. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/py.typed +0 -0
  186. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router.proto +0 -0
  187. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router_grpc.py +0 -0
  188. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router_pb2.py +0 -0
  189. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router_pb2.pyi +0 -0
  190. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  191. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  192. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/modal_version/__main__.py +0 -0
  193. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/pyproject.toml +0 -0
  194. {modal-1.3.1.dev9 → modal-1.3.1.dev11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev9
3
+ Version: 1.3.1.dev11
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -19,7 +19,7 @@ from ._functions import _Function
19
19
  from ._utils.async_utils import synchronizer
20
20
  from ._utils.deprecation import deprecation_warning
21
21
  from ._utils.function_utils import callable_has_non_self_params
22
- from .config import config, logger
22
+ from .config import config
23
23
  from .exception import InvalidError
24
24
 
25
25
  MAX_MAX_BATCH_SIZE = 1000
@@ -125,7 +125,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
125
125
  user_cls: Optional[type] = None # class
126
126
  flags: _PartialFunctionFlags
127
127
  params: _PartialFunctionParams
128
- registered: bool
129
128
 
130
129
  def __init__(
131
130
  self,
@@ -141,7 +140,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
141
140
  self.user_cls = None
142
141
  self.flags = flags
143
142
  self.params = params
144
- self.registered = False
145
143
  self.validate_flag_composition()
146
144
 
147
145
  def stack(self, flags: _PartialFunctionFlags, params: _PartialFunctionParams) -> typing_extensions.Self:
@@ -156,13 +154,11 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
156
154
  uses_interface_flags = self.flags & _PartialFunctionFlags.interface_flags()
157
155
  uses_lifecycle_flags = self.flags & _PartialFunctionFlags.lifecycle_flags()
158
156
  if uses_interface_flags and uses_lifecycle_flags:
159
- self.registered = True # Hacky, avoid false-positive warning
160
157
  raise InvalidError("Interface decorators cannot be combined with lifecycle decorators.")
161
158
 
162
159
  has_web_interface = self.flags & _PartialFunctionFlags.WEB_INTERFACE
163
160
  has_callable_interface = self.flags & _PartialFunctionFlags.CALLABLE_INTERFACE
164
161
  if has_web_interface and has_callable_interface:
165
- self.registered = True # Hacky, avoid false-positive warning
166
162
  raise InvalidError("Callable decorators cannot be combined with web interface decorators.")
167
163
 
168
164
  def validate_obj_compatibility(
@@ -174,20 +170,17 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
174
170
  uses_lifecycle_flags = self.flags & _PartialFunctionFlags.lifecycle_flags()
175
171
  uses_interface_flags = self.flags & _PartialFunctionFlags.interface_flags()
176
172
  if self.user_cls is not None and (uses_lifecycle_flags or uses_interface_flags):
177
- self.registered = True # Hacky, avoid false-positive warning
178
173
  raise InvalidError(
179
174
  f"Cannot apply `@modal.{decorator_name}` to a class. Hint: consider applying to a method instead."
180
175
  )
181
176
 
182
177
  wrapped_object = self.raw_f or self.user_cls
183
178
  if isinstance(wrapped_object, _Function):
184
- self.registered = True # Hacky, avoid false-positive warning
185
179
  raise InvalidError(
186
180
  f"Cannot stack `@modal.{decorator_name}` on top of `@app.function`."
187
181
  " Hint: swap the order of the decorators."
188
182
  )
189
183
  elif isinstance(wrapped_object, _Cls):
190
- self.registered = True # Hacky, avoid false-positive warning
191
184
  raise InvalidError(
192
185
  f"Cannot stack `@modal.{decorator_name}` on top of `@app.cls()`."
193
186
  " Hint: swap the order of the decorators."
@@ -196,15 +189,12 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
196
189
  # Run some assertions about a callable wrappee defined by the specific decorator used
197
190
  if self.raw_f is not None:
198
191
  if not callable(self.raw_f):
199
- self.registered = True # Hacky, avoid false-positive warning
200
192
  raise InvalidError(f"The object wrapped by `@modal.{decorator_name}` must be callable.")
201
193
 
202
194
  if require_sync and inspect.iscoroutinefunction(self.raw_f):
203
- self.registered = True # Hacky, avoid false-positive warning
204
195
  raise InvalidError(f"The `@modal.{decorator_name}` decorator can't be applied to an async function.")
205
196
 
206
197
  if require_nullary and callable_has_non_self_params(self.raw_f):
207
- self.registered = True # Hacky, avoid false-positive warning
208
198
  raise InvalidError(f"Functions decorated by `@modal.{decorator_name}` can't have parameters.")
209
199
 
210
200
  def _get_raw_f(self) -> Callable[P, ReturnType]:
@@ -244,17 +234,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
244
234
  # to let it be bound to a variable and become a Function later on
245
235
  return self # type: ignore # this returns a PartialFunction in a special internal case
246
236
 
247
- def __del__(self):
248
- if self.registered is False:
249
- if self.raw_f is not None:
250
- name, object_type, suggestion = self.raw_f.__name__, "function", "@app.function or @app.cls"
251
- elif self.user_cls is not None:
252
- name, object_type, suggestion = self.user_cls.__name__, "class", "@app.cls"
253
- logger.warning(
254
- f"The `{name}` {object_type} was never registered with the App."
255
- f" Did you forget an {suggestion} decorator?"
256
- )
257
-
258
237
 
259
238
  def _find_partial_methods_for_user_cls(user_cls: type[Any], flags: int) -> dict[str, _PartialFunction]:
260
239
  """Grabs all method on a user class, and returns partials. Includes legacy methods."""
@@ -813,7 +813,6 @@ class _App:
813
813
 
814
814
  if isinstance(f, _PartialFunction):
815
815
  # typically for @function-wrapped @web_endpoint, @asgi_app, or @batched
816
- f.registered = True
817
816
 
818
817
  # but we don't support @app.function wrapping a method.
819
818
  if is_method_fn(f.raw_f.__qualname__):
@@ -1052,7 +1051,6 @@ class _App:
1052
1051
  # Check if the decorated object is a class
1053
1052
  http_config = None
1054
1053
  if isinstance(wrapped_cls, _PartialFunction):
1055
- wrapped_cls.registered = True
1056
1054
  user_cls = wrapped_cls.user_cls
1057
1055
  if wrapped_cls.flags & _PartialFunctionFlags.HTTP_WEB_INTERFACE:
1058
1056
  http_config = wrapped_cls.params.http_config
@@ -1110,7 +1108,6 @@ class _App:
1110
1108
  raise InvalidError("A class must have `enable_memory_snapshot=True` to use `snap=True` on its methods.")
1111
1109
 
1112
1110
  for method in _find_partial_methods_for_user_cls(user_cls, _PartialFunctionFlags.CONCURRENT).values():
1113
- method.registered = True # Avoid warning about not registering the method (hacky!)
1114
1111
  raise InvalidError(
1115
1112
  "The `@modal.concurrent` decorator cannot be used on methods; decorate the class instead."
1116
1113
  )
@@ -1118,7 +1115,6 @@ class _App:
1118
1115
  for method in _find_partial_methods_for_user_cls(
1119
1116
  user_cls, _PartialFunctionFlags.HTTP_WEB_INTERFACE
1120
1117
  ).values():
1121
- method.registered = True # Avoid warning about not registering the method (hacky!)
1122
1118
  raise InvalidError(
1123
1119
  "The `@modal.http_server` decorator cannot be used on methods; decorate the class instead."
1124
1120
  )
@@ -1127,7 +1123,6 @@ class _App:
1127
1123
  for method in _find_partial_methods_for_user_cls(
1128
1124
  user_cls, _PartialFunctionFlags.CALLABLE_INTERFACE
1129
1125
  ).values():
1130
- method.registered = True # Avoid warning about not registering the method (hacky!)
1131
1126
  raise InvalidError("Callable decorators cannot be combined with web interface decorators.")
1132
1127
 
1133
1128
  info = FunctionInfo(None, serialized=serialized, user_cls=user_cls)
@@ -1182,7 +1177,6 @@ class _App:
1182
1177
  if partial_function.params.webhook_config is not None:
1183
1178
  full_name = f"{user_cls.__name__}.{method_name}"
1184
1179
  local_state.web_endpoints.append(full_name)
1185
- partial_function.registered = True
1186
1180
 
1187
1181
  tag: str = user_cls.__name__
1188
1182
  self._add_class(tag, cls)
@@ -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.3.1.dev9",
36
+ version: str = "1.3.1.dev11",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.3.1.dev9",
166
+ version: str = "1.3.1.dev11",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -579,12 +579,9 @@ More information on class parameterization can be found here: https://modal.com/
579
579
  # validate signature
580
580
  _Cls.validate_construction_mechanism(user_cls)
581
581
 
582
- # Disable the warning that lifecycle methods are not wrapped
583
582
  lifecycle_method_partials = _find_partial_methods_for_user_cls(
584
583
  user_cls, ~_PartialFunctionFlags.interface_flags()
585
584
  )
586
- for partial_function in lifecycle_method_partials.values():
587
- partial_function.registered = True
588
585
 
589
586
  method_partials = _find_partial_methods_for_user_cls(user_cls, _PartialFunctionFlags.interface_flags())
590
587
 
@@ -18,7 +18,6 @@ class PartialFunction(
18
18
  user_cls: typing.Optional[type]
19
19
  flags: modal._partial_function._PartialFunctionFlags
20
20
  params: modal._partial_function._PartialFunctionParams
21
- registered: bool
22
21
 
23
22
  def __init__(
24
23
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.1.dev9
3
+ Version: 1.3.1.dev11
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -2894,6 +2894,7 @@ message SandboxHandleMetadata {
2894
2894
 
2895
2895
  message SandboxInfo {
2896
2896
  string id = 1;
2897
+ reserved 2; // modal.client.Sandbox definition
2897
2898
  double created_at = 3;
2898
2899
  TaskInfo task_info = 4;
2899
2900
  string app_id = 5;
@@ -2902,7 +2903,6 @@ message SandboxInfo {
2902
2903
  string image_id = 8;
2903
2904
  ResourceInfo resource_info = 9;
2904
2905
  repeated string regions = 10;
2905
- reserved 2; // modal.client.Sandbox definition
2906
2906
  }
2907
2907
 
2908
2908
 
@@ -3115,6 +3115,12 @@ message SecretMetadata {
3115
3115
  CreationInfo creation_info = 2;
3116
3116
  }
3117
3117
 
3118
+ message ServiceUserIdentity {
3119
+ string service_user_id = 1;
3120
+ string service_user_name = 2;
3121
+ UserIdentity created_by = 3;
3122
+ }
3123
+
3118
3124
  // SharedVolume in the backend corresponds to NetworkFileSystem in the current API
3119
3125
 
3120
3126
  message SharedVolumeDeleteRequest {
@@ -3336,6 +3342,23 @@ message TokenFlowWaitResponse {
3336
3342
  string workspace_username = 4;
3337
3343
  }
3338
3344
 
3345
+ message TokenInfoGetRequest {}
3346
+
3347
+ message TokenInfoGetResponse {
3348
+ string token_id = 1;
3349
+ string workspace_id = 2;
3350
+ string workspace_name = 3;
3351
+
3352
+ oneof identity {
3353
+ UserIdentity user_identity = 4;
3354
+ ServiceUserIdentity service_user_identity = 5;
3355
+ }
3356
+
3357
+ // Token metadata
3358
+ google.protobuf.Timestamp created_at = 6;
3359
+ google.protobuf.Timestamp expires_at = 7;
3360
+ }
3361
+
3339
3362
  message TunnelData {
3340
3363
  string host = 1;
3341
3364
  uint32 port = 2;
@@ -3375,6 +3398,11 @@ message UserActionInfo {
3375
3398
  double timestamp = 2;
3376
3399
  }
3377
3400
 
3401
+ message UserIdentity {
3402
+ string user_id = 1;
3403
+ string username = 2;
3404
+ }
3405
+
3378
3406
  message VolumeCommitRequest {
3379
3407
  // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
3380
3408
  // a volume mount.
@@ -3858,6 +3886,7 @@ service ModalClient {
3858
3886
  // Tokens (web auth flow)
3859
3887
  rpc TokenFlowCreate(TokenFlowCreateRequest) returns (TokenFlowCreateResponse);
3860
3888
  rpc TokenFlowWait(TokenFlowWaitRequest) returns (TokenFlowWaitResponse);
3889
+ rpc TokenInfoGet(TokenInfoGetRequest) returns (TokenInfoGetResponse);
3861
3890
 
3862
3891
  // Tunnels
3863
3892
  rpc TunnelStart(TunnelStartRequest) returns (TunnelStartResponse);
@@ -631,6 +631,10 @@ class ModalClientBase(abc.ABC):
631
631
  async def TokenFlowWait(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TokenFlowWaitRequest, modal_proto.api_pb2.TokenFlowWaitResponse]') -> None:
632
632
  pass
633
633
 
634
+ @abc.abstractmethod
635
+ async def TokenInfoGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TokenInfoGetRequest, modal_proto.api_pb2.TokenInfoGetResponse]') -> None:
636
+ pass
637
+
634
638
  @abc.abstractmethod
635
639
  async def TunnelStart(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TunnelStartRequest, modal_proto.api_pb2.TunnelStartResponse]') -> None:
636
640
  pass
@@ -1635,6 +1639,12 @@ class ModalClientBase(abc.ABC):
1635
1639
  modal_proto.api_pb2.TokenFlowWaitRequest,
1636
1640
  modal_proto.api_pb2.TokenFlowWaitResponse,
1637
1641
  ),
1642
+ '/modal.client.ModalClient/TokenInfoGet': grpclib.const.Handler(
1643
+ self.TokenInfoGet,
1644
+ grpclib.const.Cardinality.UNARY_UNARY,
1645
+ modal_proto.api_pb2.TokenInfoGetRequest,
1646
+ modal_proto.api_pb2.TokenInfoGetResponse,
1647
+ ),
1638
1648
  '/modal.client.ModalClient/TunnelStart': grpclib.const.Handler(
1639
1649
  self.TunnelStart,
1640
1650
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2685,6 +2695,12 @@ class ModalClientStub:
2685
2695
  modal_proto.api_pb2.TokenFlowWaitRequest,
2686
2696
  modal_proto.api_pb2.TokenFlowWaitResponse,
2687
2697
  )
2698
+ self.TokenInfoGet = grpclib.client.UnaryUnaryMethod(
2699
+ channel,
2700
+ '/modal.client.ModalClient/TokenInfoGet',
2701
+ modal_proto.api_pb2.TokenInfoGetRequest,
2702
+ modal_proto.api_pb2.TokenInfoGetResponse,
2703
+ )
2688
2704
  self.TunnelStart = grpclib.client.UnaryUnaryMethod(
2689
2705
  channel,
2690
2706
  '/modal.client.ModalClient/TunnelStart',