modal 1.1.5.dev22__py3-none-any.whl → 1.1.5.dev24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

@@ -437,9 +437,9 @@ def main(container_args: api_pb2.ContainerArguments, client: Client):
437
437
  param_kwargs,
438
438
  )
439
439
  else:
440
+ assert ser_usr_cls is None
440
441
  service = import_single_function_service(
441
442
  function_def,
442
- ser_usr_cls,
443
443
  ser_fun,
444
444
  )
445
445
 
@@ -93,9 +93,9 @@ def construct_webhook_callable(
93
93
 
94
94
  @dataclass
95
95
  class ImportedFunction(Service):
96
- user_cls_instance: Any
97
96
  app: modal.app._App
98
97
  service_deps: Optional[Sequence["modal._object._Object"]]
98
+ user_cls_instance = None
99
99
 
100
100
  _user_defined_callable: Callable[..., Any]
101
101
 
@@ -199,7 +199,6 @@ def get_user_class_instance(_cls: modal.cls._Cls, args: tuple[Any, ...], kwargs:
199
199
 
200
200
  def import_single_function_service(
201
201
  function_def: api_pb2.Function,
202
- ser_cls: Optional[type], # used only for @build functions
203
202
  ser_fun: Optional[Callable[..., Any]],
204
203
  ) -> Service:
205
204
  """Imports a function dynamically, and locates the app.
@@ -228,12 +227,9 @@ def import_single_function_service(
228
227
  service_deps: Optional[Sequence["modal._object._Object"]] = None
229
228
  active_app: modal.app._App
230
229
 
231
- user_cls_or_cls: typing.Union[None, type, modal.cls.Cls]
232
- user_cls_instance = None
233
-
234
230
  if ser_fun is not None:
235
231
  # This is a serialized function we already fetched from the server
236
- user_cls_or_cls, user_defined_callable = ser_cls, ser_fun
232
+ user_defined_callable = ser_fun
237
233
  active_app = get_active_app_fallback(function_def)
238
234
  else:
239
235
  # Load the module dynamically
@@ -244,58 +240,22 @@ def import_single_function_service(
244
240
  raise LocalFunctionError("Attempted to load a function defined in a function scope")
245
241
 
246
242
  parts = qual_name.split(".")
247
- if len(parts) == 1:
248
- # This is a function
249
- user_cls_or_cls = None
250
- f = getattr(module, qual_name)
251
- if isinstance(f, Function):
252
- _function: modal._functions._Function[Any, Any, Any] = synchronizer._translate_in(f) # type: ignore
253
- service_deps = _function.deps(only_explicit_mounts=True)
254
- user_defined_callable = _function.get_raw_f()
255
- assert _function._app # app should always be set on a decorated function
256
- active_app = _function._app
257
- else:
258
- user_defined_callable = f
259
- active_app = get_active_app_fallback(function_def)
260
-
261
- elif len(parts) == 2:
262
- # This path should only be triggered by @build class builder methods and can be removed
263
- # once @build is deprecated.
264
- assert not function_def.use_method_name # new "placeholder methods" should not be invoked directly!
265
- assert function_def.is_builder_function
266
- cls_name, fun_name = parts
267
- user_cls_or_cls = getattr(module, cls_name)
268
- if isinstance(user_cls_or_cls, modal.cls.Cls):
269
- # The cls decorator is in global scope
270
- _cls = typing.cast(modal.cls._Cls, synchronizer._translate_in(user_cls_or_cls))
271
- user_defined_callable = _cls._callables[fun_name]
272
- # Intentionally not including these, since @build functions don't actually
273
- # forward the information from their parent class.
274
- # service_deps = _cls._get_class_service_function().deps(only_explicit_mounts=True)
275
- assert _cls._app
276
- active_app = _cls._app
277
- else:
278
- # This is non-decorated class
279
- user_defined_callable = getattr(user_cls_or_cls, fun_name) # unbound method
280
- active_app = get_active_app_fallback(function_def)
281
- else:
243
+ if len(parts) != 1:
282
244
  raise InvalidError(f"Invalid function qualname {qual_name}")
283
245
 
284
- # Instantiate the class if it's defined
285
- if user_cls_or_cls:
286
- if isinstance(user_cls_or_cls, modal.cls.Cls):
287
- # This code is only used for @build methods on classes
288
- _cls = typing.cast(modal.cls._Cls, user_cls_or_cls)
289
- user_cls_instance = get_user_class_instance(_cls, (), {})
290
- # Bind the unbound method to the instance as self (using the descriptor protocol!)
246
+ f = getattr(module, qual_name)
247
+ if isinstance(f, Function):
248
+ _function: modal._functions._Function[Any, Any, Any] = synchronizer._translate_in(f) # type: ignore
249
+ service_deps = _function.deps(only_explicit_mounts=True)
250
+ user_defined_callable = _function.get_raw_f()
251
+ assert _function._app # app should always be set on a decorated function
252
+ active_app = _function._app
291
253
  else:
292
- # serialized=True or "undecorated"
293
- user_cls_instance = user_cls_or_cls()
294
-
295
- user_defined_callable = user_defined_callable.__get__(user_cls_instance)
254
+ # function isn't decorated in global scope
255
+ user_defined_callable = f
256
+ active_app = get_active_app_fallback(function_def)
296
257
 
297
258
  return ImportedFunction(
298
- user_cls_instance,
299
259
  active_app,
300
260
  service_deps,
301
261
  user_defined_callable,
modal/client.pyi CHANGED
@@ -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.1.5.dev22",
36
+ version: str = "1.1.5.dev24",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev22",
167
+ version: str = "1.1.5.dev24",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -365,15 +365,13 @@ class _FlashPrometheusAutoscaler:
365
365
  # n_containers_unhealthy = number of dns registered containers that are not emitting metrics
366
366
  n_containers_unhealthy = n_total_containers - n_containers_with_metrics
367
367
 
368
- # number of total containers - buffer containers
369
- # This is used in 1) scale ratio denominators 2) provisioning base.
370
368
  # Max is used to handle case when buffer_containers are first initialized.
371
369
  num_provisioned_containers = max(n_current_replicas - buffer_containers, 1)
372
370
 
373
- # Scale up assuming that every unhealthy container is at (1 + scale_up_tolerance)x the target metric value.
371
+ # Scale up assuming that every unhealthy container is at 1.5 x (1 + scale_up_tolerance) the target metric value.
374
372
  # This way if all containers are unhealthy, we will increase our number of containers.
375
373
  scale_up_target_metric_value = (
376
- sum_metric + (1 + self.scale_up_tolerance) * n_containers_unhealthy * target_metric_value
374
+ sum_metric + 1.5 * (1 + self.scale_up_tolerance) * n_containers_unhealthy * target_metric_value
377
375
  ) / (num_provisioned_containers)
378
376
 
379
377
  # Scale down assuming that every container (including cold starting containers) are at the target metric value.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev22
3
+ Version: 1.1.5.dev24
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=WMaRW-2IJRGA9ioNAaBhJYuyLvu-GS01L8wQD90fKBs,2682
2
2
  modal/__main__.py,sha256=45H-GtwzaDfN-1nP4_HYvzN3s7AG_HXR4-ynrsjO_OI,2803
3
3
  modal/_clustered_functions.py,sha256=Sy4Sf_17EO8OL-FUe8LYcm4hrqLyQFCssNhr3p0SroU,3013
4
4
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
5
- modal/_container_entrypoint.py,sha256=a1HAQYh1gGpqHuhSw6AW7XDYHztbeYr5a8iNnfCnoks,29023
5
+ modal/_container_entrypoint.py,sha256=fLluT_sU34vGPCTG1Q58VI1RvxF5n7vQzCVCsL-MMk8,29033
6
6
  modal/_functions.py,sha256=1ZG8TvI3TTByfzArrjSww6pQB1iH4be0I3yQfkMfgAY,89780
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
@@ -22,7 +22,7 @@ modal/app.py,sha256=OBFaL-8KVMtBMEmspHA76LvblPdnSgdoGioLkQBjhdQ,48851
22
22
  modal/app.pyi,sha256=Cqk3pOeEEroCLejj3yJ3XHDqt0rMzeSA295gMKEx6Ww,43955
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=i4IpZBZyoAz8wGfv8tH9R0UgtbLAMraQhjBCPHxbHOw,15831
25
+ modal/client.pyi,sha256=us36PiyarU0FrCAtcpfcLAMUCNlMDWGJOEm-Mbg5LiM,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=qb9h_ZKiz2q7fwKQ-5bdkz1x3tdu6sIm-UI09aQjPPc,41101
@@ -88,7 +88,7 @@ modal/_runtime/execution_context.py,sha256=AYrNQRHHXEqX2MwMf8zxelKZnYf25RE_B-NRL
88
88
  modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdgWuU4W9k,2426
89
89
  modal/_runtime/gpu_memory_snapshot.py,sha256=BWIMKkH-UXTQOJJuXbM15UWCHHSYlJ0XxGlZunKb0Ug,11877
90
90
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
91
- modal/_runtime/user_code_imports.py,sha256=78wJyleqY2RVibqcpbDQyfWVBVT9BjyHPeoV9WdwV5Y,17720
91
+ modal/_runtime/user_code_imports.py,sha256=SSkrluFuOtcM0NIOwqVlcFhAKhkAGjnPKjJj_Ht_nzk,15574
92
92
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
93
93
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
94
94
  modal/_utils/async_utils.py,sha256=7uA4KJV7XRgak5nXZSGRE-RN1h91UOyNwK6v_ilUQMQ,29737
@@ -150,10 +150,10 @@ modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVsh
150
150
  modal/cli/programs/run_marimo.py,sha256=HyZ2za0NYqg31-mGxFQxUIAJ3Q-jRaMocEwWwI5-cdw,2887
151
151
  modal/cli/programs/vscode.py,sha256=KbTAaIXyQBVCDXxXjmBHmKpgXkUw0q4R4KkJvUjCYgk,3380
152
152
  modal/experimental/__init__.py,sha256=fCqzo_f3vcY750vHtd7CtLs5dvdM_C0ZLLGb3zXuK9w,14913
153
- modal/experimental/flash.py,sha256=8HOHZ0XLSN8Znzsi6hGggS46CC6t_7IgGWyNoeSXS9o,28417
153
+ modal/experimental/flash.py,sha256=7qRAL2Nrwbb60YKobcnpM0zJ8vw4xGJqabLPFgEzMZE,28295
154
154
  modal/experimental/flash.pyi,sha256=R9VV0UDotiY9BRUjacB-xI4qhR3yBymAvEZFRFHztLs,15143
155
155
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
156
- modal-1.1.5.dev22.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
156
+ modal-1.1.5.dev24.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
157
157
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
158
158
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
159
159
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
176
176
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
177
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_version/__init__.py,sha256=5dalLLvwzLOzWWIsM-DirmmYqjUqmI2Whec8hCSnPvQ,121
179
+ modal_version/__init__.py,sha256=BRQ3z_a6RSG8-f9fEnDvMa3yRNG-JxSWmyy5uTbRnvQ,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.5.dev22.dist-info/METADATA,sha256=cd7GvW743zbi3TV82_2mSVCrBEOZoh7x7jhQ5phMiQg,2460
182
- modal-1.1.5.dev22.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.5.dev22.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.5.dev22.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.5.dev22.dist-info/RECORD,,
181
+ modal-1.1.5.dev24.dist-info/METADATA,sha256=abLubH9UXnekHrhffWoQzTIpKyOvq-h_Ix5EIfeYi7Y,2460
182
+ modal-1.1.5.dev24.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
+ modal-1.1.5.dev24.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
+ modal-1.1.5.dev24.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
+ modal-1.1.5.dev24.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.5.dev22"
4
+ __version__ = "1.1.5.dev24"