modal 0.73.164__tar.gz → 0.73.165__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 (184) hide show
  1. {modal-0.73.164 → modal-0.73.165}/PKG-INFO +1 -1
  2. {modal-0.73.164 → modal-0.73.165}/modal/_container_entrypoint.py +31 -30
  3. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/execution_context.py +13 -0
  4. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/execution_context.pyi +1 -0
  5. {modal-0.73.164 → modal-0.73.165}/modal/client.pyi +2 -2
  6. {modal-0.73.164 → modal-0.73.165}/modal/functions.pyi +6 -6
  7. {modal-0.73.164 → modal-0.73.165}/modal/mount.py +0 -6
  8. {modal-0.73.164 → modal-0.73.165}/modal/runner.py +4 -7
  9. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/PKG-INFO +1 -1
  10. {modal-0.73.164 → modal-0.73.165}/modal_version/_version_generated.py +1 -1
  11. {modal-0.73.164 → modal-0.73.165}/LICENSE +0 -0
  12. {modal-0.73.164 → modal-0.73.165}/README.md +0 -0
  13. {modal-0.73.164 → modal-0.73.165}/modal/__init__.py +0 -0
  14. {modal-0.73.164 → modal-0.73.165}/modal/__main__.py +0 -0
  15. {modal-0.73.164 → modal-0.73.165}/modal/_clustered_functions.py +0 -0
  16. {modal-0.73.164 → modal-0.73.165}/modal/_clustered_functions.pyi +0 -0
  17. {modal-0.73.164 → modal-0.73.165}/modal/_functions.py +0 -0
  18. {modal-0.73.164 → modal-0.73.165}/modal/_ipython.py +0 -0
  19. {modal-0.73.164 → modal-0.73.165}/modal/_location.py +0 -0
  20. {modal-0.73.164 → modal-0.73.165}/modal/_object.py +0 -0
  21. {modal-0.73.164 → modal-0.73.165}/modal/_output.py +0 -0
  22. {modal-0.73.164 → modal-0.73.165}/modal/_partial_function.py +0 -0
  23. {modal-0.73.164 → modal-0.73.165}/modal/_proxy_tunnel.py +0 -0
  24. {modal-0.73.164 → modal-0.73.165}/modal/_pty.py +0 -0
  25. {modal-0.73.164 → modal-0.73.165}/modal/_resolver.py +0 -0
  26. {modal-0.73.164 → modal-0.73.165}/modal/_resources.py +0 -0
  27. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/__init__.py +0 -0
  28. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/asgi.py +0 -0
  29. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/container_io_manager.py +0 -0
  30. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/container_io_manager.pyi +0 -0
  31. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/telemetry.py +0 -0
  33. {modal-0.73.164 → modal-0.73.165}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-0.73.164 → modal-0.73.165}/modal/_serialization.py +0 -0
  35. {modal-0.73.164 → modal-0.73.165}/modal/_traceback.py +0 -0
  36. {modal-0.73.164 → modal-0.73.165}/modal/_tunnel.py +0 -0
  37. {modal-0.73.164 → modal-0.73.165}/modal/_tunnel.pyi +0 -0
  38. {modal-0.73.164 → modal-0.73.165}/modal/_type_manager.py +0 -0
  39. {modal-0.73.164 → modal-0.73.165}/modal/_utils/__init__.py +0 -0
  40. {modal-0.73.164 → modal-0.73.165}/modal/_utils/app_utils.py +0 -0
  41. {modal-0.73.164 → modal-0.73.165}/modal/_utils/async_utils.py +0 -0
  42. {modal-0.73.164 → modal-0.73.165}/modal/_utils/blob_utils.py +0 -0
  43. {modal-0.73.164 → modal-0.73.165}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-0.73.164 → modal-0.73.165}/modal/_utils/deprecation.py +0 -0
  45. {modal-0.73.164 → modal-0.73.165}/modal/_utils/docker_utils.py +0 -0
  46. {modal-0.73.164 → modal-0.73.165}/modal/_utils/function_utils.py +0 -0
  47. {modal-0.73.164 → modal-0.73.165}/modal/_utils/git_utils.py +0 -0
  48. {modal-0.73.164 → modal-0.73.165}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-0.73.164 → modal-0.73.165}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-0.73.164 → modal-0.73.165}/modal/_utils/hash_utils.py +0 -0
  51. {modal-0.73.164 → modal-0.73.165}/modal/_utils/http_utils.py +0 -0
  52. {modal-0.73.164 → modal-0.73.165}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-0.73.164 → modal-0.73.165}/modal/_utils/logger.py +0 -0
  54. {modal-0.73.164 → modal-0.73.165}/modal/_utils/mount_utils.py +0 -0
  55. {modal-0.73.164 → modal-0.73.165}/modal/_utils/name_utils.py +0 -0
  56. {modal-0.73.164 → modal-0.73.165}/modal/_utils/package_utils.py +0 -0
  57. {modal-0.73.164 → modal-0.73.165}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-0.73.164 → modal-0.73.165}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-0.73.164 → modal-0.73.165}/modal/_utils/shell_utils.py +0 -0
  60. {modal-0.73.164 → modal-0.73.165}/modal/_vendor/__init__.py +0 -0
  61. {modal-0.73.164 → modal-0.73.165}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  62. {modal-0.73.164 → modal-0.73.165}/modal/_vendor/cloudpickle.py +0 -0
  63. {modal-0.73.164 → modal-0.73.165}/modal/_vendor/tblib.py +0 -0
  64. {modal-0.73.164 → modal-0.73.165}/modal/_watcher.py +0 -0
  65. {modal-0.73.164 → modal-0.73.165}/modal/app.py +0 -0
  66. {modal-0.73.164 → modal-0.73.165}/modal/app.pyi +0 -0
  67. {modal-0.73.164 → modal-0.73.165}/modal/call_graph.py +0 -0
  68. {modal-0.73.164 → modal-0.73.165}/modal/cli/__init__.py +0 -0
  69. {modal-0.73.164 → modal-0.73.165}/modal/cli/_download.py +0 -0
  70. {modal-0.73.164 → modal-0.73.165}/modal/cli/_traceback.py +0 -0
  71. {modal-0.73.164 → modal-0.73.165}/modal/cli/app.py +0 -0
  72. {modal-0.73.164 → modal-0.73.165}/modal/cli/config.py +0 -0
  73. {modal-0.73.164 → modal-0.73.165}/modal/cli/container.py +0 -0
  74. {modal-0.73.164 → modal-0.73.165}/modal/cli/dict.py +0 -0
  75. {modal-0.73.164 → modal-0.73.165}/modal/cli/entry_point.py +0 -0
  76. {modal-0.73.164 → modal-0.73.165}/modal/cli/environment.py +0 -0
  77. {modal-0.73.164 → modal-0.73.165}/modal/cli/import_refs.py +0 -0
  78. {modal-0.73.164 → modal-0.73.165}/modal/cli/launch.py +0 -0
  79. {modal-0.73.164 → modal-0.73.165}/modal/cli/network_file_system.py +0 -0
  80. {modal-0.73.164 → modal-0.73.165}/modal/cli/profile.py +0 -0
  81. {modal-0.73.164 → modal-0.73.165}/modal/cli/programs/__init__.py +0 -0
  82. {modal-0.73.164 → modal-0.73.165}/modal/cli/programs/run_jupyter.py +0 -0
  83. {modal-0.73.164 → modal-0.73.165}/modal/cli/programs/vscode.py +0 -0
  84. {modal-0.73.164 → modal-0.73.165}/modal/cli/queues.py +0 -0
  85. {modal-0.73.164 → modal-0.73.165}/modal/cli/run.py +0 -0
  86. {modal-0.73.164 → modal-0.73.165}/modal/cli/secret.py +0 -0
  87. {modal-0.73.164 → modal-0.73.165}/modal/cli/token.py +0 -0
  88. {modal-0.73.164 → modal-0.73.165}/modal/cli/utils.py +0 -0
  89. {modal-0.73.164 → modal-0.73.165}/modal/cli/volume.py +0 -0
  90. {modal-0.73.164 → modal-0.73.165}/modal/client.py +0 -0
  91. {modal-0.73.164 → modal-0.73.165}/modal/cloud_bucket_mount.py +0 -0
  92. {modal-0.73.164 → modal-0.73.165}/modal/cloud_bucket_mount.pyi +0 -0
  93. {modal-0.73.164 → modal-0.73.165}/modal/cls.py +0 -0
  94. {modal-0.73.164 → modal-0.73.165}/modal/cls.pyi +0 -0
  95. {modal-0.73.164 → modal-0.73.165}/modal/config.py +0 -0
  96. {modal-0.73.164 → modal-0.73.165}/modal/container_process.py +0 -0
  97. {modal-0.73.164 → modal-0.73.165}/modal/container_process.pyi +0 -0
  98. {modal-0.73.164 → modal-0.73.165}/modal/dict.py +0 -0
  99. {modal-0.73.164 → modal-0.73.165}/modal/dict.pyi +0 -0
  100. {modal-0.73.164 → modal-0.73.165}/modal/environments.py +0 -0
  101. {modal-0.73.164 → modal-0.73.165}/modal/environments.pyi +0 -0
  102. {modal-0.73.164 → modal-0.73.165}/modal/exception.py +0 -0
  103. {modal-0.73.164 → modal-0.73.165}/modal/experimental/__init__.py +0 -0
  104. {modal-0.73.164 → modal-0.73.165}/modal/experimental/ipython.py +0 -0
  105. {modal-0.73.164 → modal-0.73.165}/modal/file_io.py +0 -0
  106. {modal-0.73.164 → modal-0.73.165}/modal/file_io.pyi +0 -0
  107. {modal-0.73.164 → modal-0.73.165}/modal/file_pattern_matcher.py +0 -0
  108. {modal-0.73.164 → modal-0.73.165}/modal/functions.py +0 -0
  109. {modal-0.73.164 → modal-0.73.165}/modal/gpu.py +0 -0
  110. {modal-0.73.164 → modal-0.73.165}/modal/image.py +0 -0
  111. {modal-0.73.164 → modal-0.73.165}/modal/image.pyi +0 -0
  112. {modal-0.73.164 → modal-0.73.165}/modal/io_streams.py +0 -0
  113. {modal-0.73.164 → modal-0.73.165}/modal/io_streams.pyi +0 -0
  114. {modal-0.73.164 → modal-0.73.165}/modal/mount.pyi +0 -0
  115. {modal-0.73.164 → modal-0.73.165}/modal/network_file_system.py +0 -0
  116. {modal-0.73.164 → modal-0.73.165}/modal/network_file_system.pyi +0 -0
  117. {modal-0.73.164 → modal-0.73.165}/modal/object.py +0 -0
  118. {modal-0.73.164 → modal-0.73.165}/modal/object.pyi +0 -0
  119. {modal-0.73.164 → modal-0.73.165}/modal/output.py +0 -0
  120. {modal-0.73.164 → modal-0.73.165}/modal/parallel_map.py +0 -0
  121. {modal-0.73.164 → modal-0.73.165}/modal/parallel_map.pyi +0 -0
  122. {modal-0.73.164 → modal-0.73.165}/modal/partial_function.py +0 -0
  123. {modal-0.73.164 → modal-0.73.165}/modal/partial_function.pyi +0 -0
  124. {modal-0.73.164 → modal-0.73.165}/modal/proxy.py +0 -0
  125. {modal-0.73.164 → modal-0.73.165}/modal/proxy.pyi +0 -0
  126. {modal-0.73.164 → modal-0.73.165}/modal/py.typed +0 -0
  127. {modal-0.73.164 → modal-0.73.165}/modal/queue.py +0 -0
  128. {modal-0.73.164 → modal-0.73.165}/modal/queue.pyi +0 -0
  129. {modal-0.73.164 → modal-0.73.165}/modal/requirements/2023.12.312.txt +0 -0
  130. {modal-0.73.164 → modal-0.73.165}/modal/requirements/2023.12.txt +0 -0
  131. {modal-0.73.164 → modal-0.73.165}/modal/requirements/2024.04.txt +0 -0
  132. {modal-0.73.164 → modal-0.73.165}/modal/requirements/2024.10.txt +0 -0
  133. {modal-0.73.164 → modal-0.73.165}/modal/requirements/PREVIEW.txt +0 -0
  134. {modal-0.73.164 → modal-0.73.165}/modal/requirements/README.md +0 -0
  135. {modal-0.73.164 → modal-0.73.165}/modal/requirements/base-images.json +0 -0
  136. {modal-0.73.164 → modal-0.73.165}/modal/retries.py +0 -0
  137. {modal-0.73.164 → modal-0.73.165}/modal/runner.pyi +0 -0
  138. {modal-0.73.164 → modal-0.73.165}/modal/running_app.py +0 -0
  139. {modal-0.73.164 → modal-0.73.165}/modal/sandbox.py +0 -0
  140. {modal-0.73.164 → modal-0.73.165}/modal/sandbox.pyi +0 -0
  141. {modal-0.73.164 → modal-0.73.165}/modal/schedule.py +0 -0
  142. {modal-0.73.164 → modal-0.73.165}/modal/scheduler_placement.py +0 -0
  143. {modal-0.73.164 → modal-0.73.165}/modal/secret.py +0 -0
  144. {modal-0.73.164 → modal-0.73.165}/modal/secret.pyi +0 -0
  145. {modal-0.73.164 → modal-0.73.165}/modal/serving.py +0 -0
  146. {modal-0.73.164 → modal-0.73.165}/modal/serving.pyi +0 -0
  147. {modal-0.73.164 → modal-0.73.165}/modal/snapshot.py +0 -0
  148. {modal-0.73.164 → modal-0.73.165}/modal/snapshot.pyi +0 -0
  149. {modal-0.73.164 → modal-0.73.165}/modal/stream_type.py +0 -0
  150. {modal-0.73.164 → modal-0.73.165}/modal/token_flow.py +0 -0
  151. {modal-0.73.164 → modal-0.73.165}/modal/token_flow.pyi +0 -0
  152. {modal-0.73.164 → modal-0.73.165}/modal/volume.py +0 -0
  153. {modal-0.73.164 → modal-0.73.165}/modal/volume.pyi +0 -0
  154. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/SOURCES.txt +0 -0
  155. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/dependency_links.txt +0 -0
  156. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/entry_points.txt +0 -0
  157. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/requires.txt +0 -0
  158. {modal-0.73.164 → modal-0.73.165}/modal.egg-info/top_level.txt +0 -0
  159. {modal-0.73.164 → modal-0.73.165}/modal_docs/__init__.py +0 -0
  160. {modal-0.73.164 → modal-0.73.165}/modal_docs/gen_cli_docs.py +0 -0
  161. {modal-0.73.164 → modal-0.73.165}/modal_docs/gen_reference_docs.py +0 -0
  162. {modal-0.73.164 → modal-0.73.165}/modal_docs/mdmd/__init__.py +0 -0
  163. {modal-0.73.164 → modal-0.73.165}/modal_docs/mdmd/mdmd.py +0 -0
  164. {modal-0.73.164 → modal-0.73.165}/modal_docs/mdmd/signatures.py +0 -0
  165. {modal-0.73.164 → modal-0.73.165}/modal_proto/__init__.py +0 -0
  166. {modal-0.73.164 → modal-0.73.165}/modal_proto/api.proto +0 -0
  167. {modal-0.73.164 → modal-0.73.165}/modal_proto/api_grpc.py +0 -0
  168. {modal-0.73.164 → modal-0.73.165}/modal_proto/api_pb2.py +0 -0
  169. {modal-0.73.164 → modal-0.73.165}/modal_proto/api_pb2.pyi +0 -0
  170. {modal-0.73.164 → modal-0.73.165}/modal_proto/api_pb2_grpc.py +0 -0
  171. {modal-0.73.164 → modal-0.73.165}/modal_proto/api_pb2_grpc.pyi +0 -0
  172. {modal-0.73.164 → modal-0.73.165}/modal_proto/modal_api_grpc.py +0 -0
  173. {modal-0.73.164 → modal-0.73.165}/modal_proto/modal_options_grpc.py +0 -0
  174. {modal-0.73.164 → modal-0.73.165}/modal_proto/options.proto +0 -0
  175. {modal-0.73.164 → modal-0.73.165}/modal_proto/options_grpc.py +0 -0
  176. {modal-0.73.164 → modal-0.73.165}/modal_proto/options_pb2.py +0 -0
  177. {modal-0.73.164 → modal-0.73.165}/modal_proto/options_pb2.pyi +0 -0
  178. {modal-0.73.164 → modal-0.73.165}/modal_proto/options_pb2_grpc.py +0 -0
  179. {modal-0.73.164 → modal-0.73.165}/modal_proto/options_pb2_grpc.pyi +0 -0
  180. {modal-0.73.164 → modal-0.73.165}/modal_proto/py.typed +0 -0
  181. {modal-0.73.164 → modal-0.73.165}/modal_version/__init__.py +0 -0
  182. {modal-0.73.164 → modal-0.73.165}/modal_version/__main__.py +0 -0
  183. {modal-0.73.164 → modal-0.73.165}/pyproject.toml +0 -0
  184. {modal-0.73.164 → modal-0.73.165}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.73.164
3
+ Version: 0.73.165
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -46,13 +46,13 @@ from modal.exception import ExecutionError, InputCancellation, InvalidError
46
46
  from modal.running_app import RunningApp, running_app_from_layout
47
47
  from modal_proto import api_pb2
48
48
 
49
+ from ._runtime import execution_context
49
50
  from ._runtime.container_io_manager import (
50
51
  ContainerIOManager,
51
52
  IOContext,
52
53
  UserException,
53
54
  _ContainerIOManager,
54
55
  )
55
- from ._runtime.execution_context import _set_current_context_ids
56
56
 
57
57
  if TYPE_CHECKING:
58
58
  import modal._object
@@ -190,7 +190,7 @@ def call_function(
190
190
  async def run_input_async(io_context: IOContext) -> None:
191
191
  started_at = time.time()
192
192
  input_ids, function_call_ids = io_context.input_ids, io_context.function_call_ids
193
- reset_context = _set_current_context_ids(input_ids, function_call_ids)
193
+ reset_context = execution_context._set_current_context_ids(input_ids, function_call_ids)
194
194
  async with container_io_manager.handle_input_exception.aio(io_context, started_at):
195
195
  res = io_context.call_finalized_function()
196
196
  # TODO(erikbern): any exception below shouldn't be considered a user exception
@@ -240,7 +240,7 @@ def call_function(
240
240
  def run_input_sync(io_context: IOContext) -> None:
241
241
  started_at = time.time()
242
242
  input_ids, function_call_ids = io_context.input_ids, io_context.function_call_ids
243
- reset_context = _set_current_context_ids(input_ids, function_call_ids)
243
+ reset_context = execution_context._set_current_context_ids(input_ids, function_call_ids)
244
244
  with container_io_manager.handle_input_exception(io_context, started_at):
245
245
  res = io_context.call_finalized_function()
246
246
 
@@ -407,33 +407,34 @@ def main(container_args: api_pb2.ContainerArguments, client: Client):
407
407
  param_args = ()
408
408
  param_kwargs = {}
409
409
 
410
- if function_def.is_class:
411
- # this is a bit ugly - match the function and class based on function name to get metadata
412
- # This metadata is required in order to hydrate the class in case it's not globally
413
- # decorated (or serialized)
414
- service_base_function_id = container_args.app_layout.function_ids[function_def.function_name]
415
- service_function_hydration_data = [
416
- o for o in container_args.app_layout.objects if o.object_id == service_base_function_id
417
- ][0]
418
- class_id = container_args.app_layout.class_ids[function_def.function_name.removesuffix(".*")]
419
-
420
- service = import_class_service(
421
- function_def,
422
- service_function_hydration_data,
423
- class_id,
424
- client,
425
- ser_usr_cls,
426
- param_args,
427
- param_kwargs,
428
- )
429
- else:
430
- service = import_single_function_service(
431
- function_def,
432
- ser_usr_cls,
433
- ser_fun,
434
- param_args,
435
- param_kwargs,
436
- )
410
+ with execution_context._import_context():
411
+ if function_def.is_class:
412
+ # this is a bit ugly - match the function and class based on function name to get metadata
413
+ # This metadata is required in order to hydrate the class in case it's not globally
414
+ # decorated (or serialized)
415
+ service_base_function_id = container_args.app_layout.function_ids[function_def.function_name]
416
+ service_function_hydration_data = [
417
+ o for o in container_args.app_layout.objects if o.object_id == service_base_function_id
418
+ ][0]
419
+ class_id = container_args.app_layout.class_ids[function_def.function_name.removesuffix(".*")]
420
+
421
+ service = import_class_service(
422
+ function_def,
423
+ service_function_hydration_data,
424
+ class_id,
425
+ client,
426
+ ser_usr_cls,
427
+ param_args,
428
+ param_kwargs,
429
+ )
430
+ else:
431
+ service = import_single_function_service(
432
+ function_def,
433
+ ser_usr_cls,
434
+ ser_fun,
435
+ param_args,
436
+ param_kwargs,
437
+ )
437
438
 
438
439
  # If the cls/function decorator was applied in local scope, but the app is global, we can look it up
439
440
  if service.app is not None:
@@ -1,4 +1,5 @@
1
1
  # Copyright Modal Labs 2024
2
+ from contextlib import contextmanager
2
3
  from contextvars import ContextVar
3
4
  from typing import Callable, Optional
4
5
 
@@ -87,3 +88,15 @@ def _set_current_context_ids(input_ids: list[str], function_call_ids: list[str])
87
88
 
88
89
  _current_input_id: ContextVar = ContextVar("_current_input_id")
89
90
  _current_function_call_id: ContextVar = ContextVar("_current_function_call_id")
91
+
92
+ _is_currently_importing = False # we set this to True while a container is importing user code
93
+
94
+
95
+ @contextmanager
96
+ def _import_context():
97
+ global _is_currently_importing
98
+ _is_currently_importing = True
99
+ try:
100
+ yield
101
+ finally:
102
+ _is_currently_importing = False
@@ -17,6 +17,7 @@ def current_function_call_id() -> typing.Optional[str]: ...
17
17
  def _set_current_context_ids(
18
18
  input_ids: list[str], function_call_ids: list[str]
19
19
  ) -> collections.abc.Callable[[], None]: ...
20
+ def _import_context(): ...
20
21
 
21
22
  _current_input_id: contextvars.ContextVar
22
23
 
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "0.73.164",
34
+ version: str = "0.73.165",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -93,7 +93,7 @@ class Client:
93
93
  server_url: str,
94
94
  client_type: int,
95
95
  credentials: typing.Optional[tuple[str, str]],
96
- version: str = "0.73.164",
96
+ version: str = "0.73.165",
97
97
  ): ...
98
98
  def is_closed(self) -> bool: ...
99
99
  @property
@@ -200,11 +200,11 @@ class Function(
200
200
 
201
201
  _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
202
202
 
203
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
203
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
204
204
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
205
205
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
206
206
 
207
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
207
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
208
208
 
209
209
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
210
210
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -219,19 +219,19 @@ class Function(
219
219
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
220
220
  ) -> modal._functions.OriginalReturnType: ...
221
221
 
222
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
222
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
223
223
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
224
224
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
225
225
 
226
226
  _experimental_spawn: ___experimental_spawn_spec[
227
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
227
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
228
228
  ]
229
229
 
230
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
230
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
231
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
232
232
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
233
233
 
234
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
234
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
235
 
236
236
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
237
237
 
@@ -655,8 +655,6 @@ class _Mount(_Object, type_prefix="mo"):
655
655
  condition: Optional[Callable[[str], bool]] = None,
656
656
  ignore: Optional[Union[Sequence[str], Callable[[Path], bool]]] = None,
657
657
  ) -> "_Mount":
658
- # Don't re-run inside container.
659
-
660
658
  if condition is not None:
661
659
  if ignore is not None:
662
660
  raise InvalidError("Cannot specify both `ignore` and `condition`")
@@ -669,10 +667,6 @@ class _Mount(_Object, type_prefix="mo"):
669
667
  ignore = FilePatternMatcher(*ignore)
670
668
 
671
669
  mount = _Mount._new()
672
- from ._runtime.execution_context import is_local
673
-
674
- if not is_local():
675
- return mount # empty/non-mountable mount in case it's used from within a container
676
670
  for module_name in module_names:
677
671
  mount = mount._extend(_MountedPythonModule(module_name, remote_dir, ignore))
678
672
  return mount
@@ -12,6 +12,7 @@ from typing import TYPE_CHECKING, Any, Optional, TypeVar
12
12
  from grpclib import GRPCError, Status
13
13
  from synchronicity.async_wrap import asynccontextmanager
14
14
 
15
+ import modal._runtime.execution_context
15
16
  import modal_proto.api_pb2
16
17
  from modal_proto import api_pb2
17
18
 
@@ -19,7 +20,6 @@ from ._functions import _Function
19
20
  from ._object import _get_environment_name, _Object
20
21
  from ._pty import get_pty_info
21
22
  from ._resolver import Resolver
22
- from ._runtime.execution_context import is_local
23
23
  from ._traceback import print_server_warnings, traceback_contains_remote_call
24
24
  from ._utils.async_utils import TaskContext, gather_cancel_on_exc, synchronize_api
25
25
  from ._utils.deprecation import deprecation_error
@@ -266,12 +266,9 @@ async def _run_app(
266
266
  if environment_name is None:
267
267
  environment_name = typing.cast(str, config.get("environment"))
268
268
 
269
- if not is_local():
270
- raise InvalidError(
271
- "Can not run an app from within a container."
272
- " Are you calling app.run() directly?"
273
- " Consider using the `modal run` shell command."
274
- )
269
+ if modal._runtime.execution_context._is_currently_importing:
270
+ raise InvalidError("Can not run an app in global scope within a container")
271
+
275
272
  if app._running_app:
276
273
  raise InvalidError(
277
274
  "App is already running and can't be started again.\n"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.73.164
3
+ Version: 0.73.165
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
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 164 # git: 9d8e6de
4
+ build_number = 165 # git: 063c3c2
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
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