modal 0.73.81__py3-none-any.whl → 0.73.84__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.
modal/__init__.py CHANGED
@@ -23,7 +23,18 @@ try:
23
23
  from .mount import Mount
24
24
  from .network_file_system import NetworkFileSystem
25
25
  from .output import enable_output
26
- from .partial_function import asgi_app, batched, build, enter, exit, method, web_endpoint, web_server, wsgi_app
26
+ from .partial_function import (
27
+ asgi_app,
28
+ batched,
29
+ build,
30
+ enter,
31
+ exit,
32
+ fastapi_endpoint,
33
+ method,
34
+ web_endpoint,
35
+ web_server,
36
+ wsgi_app,
37
+ )
27
38
  from .proxy import Proxy
28
39
  from .queue import Queue
29
40
  from .retries import Retries
@@ -76,6 +87,7 @@ __all__ = [
76
87
  "enable_output",
77
88
  "enter",
78
89
  "exit",
90
+ "fastapi_endpoint",
79
91
  "forward",
80
92
  "is_local",
81
93
  "interact",
@@ -54,7 +54,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
54
54
  flags: _PartialFunctionFlags
55
55
  webhook_config: Optional[api_pb2.WebhookConfig]
56
56
  is_generator: bool
57
- keep_warm: Optional[int]
58
57
  batch_max_size: Optional[int]
59
58
  batch_wait_ms: Optional[int]
60
59
  force_build: bool
@@ -65,9 +64,9 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
65
64
  self,
66
65
  raw_f: Callable[P, ReturnType],
67
66
  flags: _PartialFunctionFlags,
67
+ *,
68
68
  webhook_config: Optional[api_pb2.WebhookConfig] = None,
69
69
  is_generator: Optional[bool] = None,
70
- keep_warm: Optional[int] = None,
71
70
  batch_max_size: Optional[int] = None,
72
71
  batch_wait_ms: Optional[int] = None,
73
72
  cluster_size: Optional[int] = None, # Experimental: Clustered functions
@@ -84,7 +83,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
84
83
  final_is_generator = is_generator
85
84
 
86
85
  self.is_generator = final_is_generator
87
- self.keep_warm = keep_warm
88
86
  self.wrapped = False # Make sure that this was converted into a FunctionHandle
89
87
  self.batch_max_size = batch_max_size
90
88
  self.batch_wait_ms = batch_wait_ms
@@ -141,7 +139,6 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
141
139
  raw_f=self.raw_f,
142
140
  flags=(self.flags | flags),
143
141
  webhook_config=self.webhook_config,
144
- keep_warm=self.keep_warm,
145
142
  batch_max_size=self.batch_max_size,
146
143
  batch_wait_ms=self.batch_wait_ms,
147
144
  force_build=self.force_build,
@@ -198,7 +195,6 @@ def _method(
198
195
  # Set this to True if it's a non-generator function returning
199
196
  # a [sync/async] generator object
200
197
  is_generator: Optional[bool] = None,
201
- keep_warm: Optional[int] = None, # Deprecated: Use keep_warm on @app.cls() instead
202
198
  ) -> _MethodDecoratorType:
203
199
  """Decorator for methods that should be transformed into a Modal Function registered against this class's App.
204
200
 
@@ -216,17 +212,6 @@ def _method(
216
212
  if _warn_parentheses_missing is not None:
217
213
  raise InvalidError("Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@method()`.")
218
214
 
219
- if keep_warm is not None:
220
- deprecation_warning(
221
- (2024, 6, 10),
222
- (
223
- "`keep_warm=` is no longer supported per-method on Modal classes. "
224
- "All methods and web endpoints of a class use the same set of containers now. "
225
- "Use keep_warm via the @app.cls() decorator instead. "
226
- ),
227
- pending=True,
228
- )
229
-
230
215
  def wrapper(raw_f: Callable[..., Any]) -> _PartialFunction:
231
216
  nonlocal is_generator
232
217
  if isinstance(raw_f, _PartialFunction) and raw_f.webhook_config:
@@ -241,7 +226,7 @@ def _method(
241
226
  "Batched function on classes should not be wrapped by `@method`. "
242
227
  "Suggestion: remove the `@method` decorator."
243
228
  )
244
- return _PartialFunction(raw_f, _PartialFunctionFlags.FUNCTION, is_generator=is_generator, keep_warm=keep_warm)
229
+ return _PartialFunction(raw_f, _PartialFunctionFlags.FUNCTION, is_generator=is_generator)
245
230
 
246
231
  return wrapper # type: ignore # synchronicity issue with wrapped vs unwrapped types and protocols
247
232
 
@@ -256,6 +241,64 @@ def _parse_custom_domains(custom_domains: Optional[Iterable[str]] = None) -> lis
256
241
  return _custom_domains
257
242
 
258
243
 
244
+ def _fastapi_endpoint(
245
+ _warn_parentheses_missing=None,
246
+ *,
247
+ method: str = "GET", # REST method for the created endpoint.
248
+ label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
249
+ custom_domains: Optional[Iterable[str]] = None, # Custom fully-qualified domain name (FQDN) for the endpoint.
250
+ docs: bool = False, # Whether to enable interactive documentation for this endpoint at /docs.
251
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
252
+ ) -> Callable[[Callable[P, ReturnType]], _PartialFunction[P, ReturnType, ReturnType]]:
253
+ """Register a basic web endpoint with this application.
254
+
255
+ This is the simple way to create a web endpoint on Modal. The function
256
+ behaves as a [FastAPI](https://fastapi.tiangolo.com/) handler and should
257
+ return a response object to the caller.
258
+
259
+ Endpoints created with `@app.fastapi_endpoint` are meant to be simple, single
260
+ request handlers and automatically have
261
+ [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) enabled.
262
+ For more flexibility, use `@app.asgi_app`.
263
+
264
+ To learn how to use Modal with popular web frameworks, see the
265
+ [guide on web endpoints](https://modal.com/docs/guide/webhooks).
266
+
267
+ This function replaces the deprecated `@web_endpoint` decorator.
268
+ """
269
+ if isinstance(_warn_parentheses_missing, str):
270
+ # Probably passing the method string as a positional argument.
271
+ raise InvalidError('Positional arguments are not allowed. Suggestion: `@fastapi_endpoint(method="GET")`.')
272
+ elif _warn_parentheses_missing is not None:
273
+ raise InvalidError(
274
+ "Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@fastapi_endpoint()`."
275
+ )
276
+
277
+ def wrapper(raw_f: Callable[..., Any]) -> _PartialFunction:
278
+ if isinstance(raw_f, _Function):
279
+ raw_f = raw_f.get_raw_f()
280
+ raise InvalidError(
281
+ f"Applying decorators for {raw_f} in the wrong order!\nUsage:\n\n"
282
+ "@app.function()\n@app.fastapi_endpoint()\ndef my_webhook():\n ..."
283
+ )
284
+
285
+ return _PartialFunction(
286
+ raw_f,
287
+ _PartialFunctionFlags.FUNCTION,
288
+ webhook_config=api_pb2.WebhookConfig(
289
+ type=api_pb2.WEBHOOK_TYPE_FUNCTION,
290
+ method=method,
291
+ web_endpoint_docs=docs,
292
+ requested_suffix=label or "",
293
+ async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
294
+ custom_domains=_parse_custom_domains(custom_domains),
295
+ requires_proxy_auth=requires_proxy_auth,
296
+ ),
297
+ )
298
+
299
+ return wrapper
300
+
301
+
259
302
  def _web_endpoint(
260
303
  _warn_parentheses_missing=None,
261
304
  *,
@@ -300,7 +343,7 @@ def _web_endpoint(
300
343
  return _PartialFunction(
301
344
  raw_f,
302
345
  _PartialFunctionFlags.FUNCTION,
303
- api_pb2.WebhookConfig(
346
+ webhook_config=api_pb2.WebhookConfig(
304
347
  type=api_pb2.WEBHOOK_TYPE_FUNCTION,
305
348
  method=method,
306
349
  web_endpoint_docs=docs,
@@ -370,7 +413,7 @@ def _asgi_app(
370
413
  return _PartialFunction(
371
414
  raw_f,
372
415
  _PartialFunctionFlags.FUNCTION,
373
- api_pb2.WebhookConfig(
416
+ webhook_config=api_pb2.WebhookConfig(
374
417
  type=api_pb2.WEBHOOK_TYPE_ASGI_APP,
375
418
  requested_suffix=label,
376
419
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
@@ -438,7 +481,7 @@ def _wsgi_app(
438
481
  return _PartialFunction(
439
482
  raw_f,
440
483
  _PartialFunctionFlags.FUNCTION,
441
- api_pb2.WebhookConfig(
484
+ webhook_config=api_pb2.WebhookConfig(
442
485
  type=api_pb2.WEBHOOK_TYPE_WSGI_APP,
443
486
  requested_suffix=label,
444
487
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
@@ -493,7 +536,7 @@ def _web_server(
493
536
  return _PartialFunction(
494
537
  raw_f,
495
538
  _PartialFunctionFlags.FUNCTION,
496
- api_pb2.WebhookConfig(
539
+ webhook_config=api_pb2.WebhookConfig(
497
540
  type=api_pb2.WEBHOOK_TYPE_WEB_SERVER,
498
541
  requested_suffix=label,
499
542
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
modal/app.py CHANGED
@@ -658,13 +658,13 @@ class _App:
658
658
  if is_method_fn(f.raw_f.__qualname__):
659
659
  raise InvalidError(
660
660
  "The `@app.function` decorator cannot be used on class methods. "
661
- "Swap with `@modal.method` or `@modal.web_endpoint`, or drop the `@app.function` decorator. "
661
+ "Swap with `@modal.method` or one of the web endpoint decorators. "
662
662
  "Example: "
663
663
  "\n\n"
664
664
  "```python\n"
665
665
  "@app.cls()\n"
666
666
  "class MyClass:\n"
667
- " @modal.web_endpoint()\n"
667
+ " @modal.method()\n"
668
668
  " def f(self, x):\n"
669
669
  " ...\n"
670
670
  "```\n"
modal/client.pyi CHANGED
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.81"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.84"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.81"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.84"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/partial_function.py CHANGED
@@ -7,6 +7,7 @@ from ._partial_function import (
7
7
  _build,
8
8
  _enter,
9
9
  _exit,
10
+ _fastapi_endpoint,
10
11
  _method,
11
12
  _PartialFunction,
12
13
  _web_endpoint,
@@ -19,6 +20,7 @@ from ._partial_function import (
19
20
  PartialFunction = synchronize_api(_PartialFunction, target_module=__name__)
20
21
  method = synchronize_api(_method, target_module=__name__)
21
22
  web_endpoint = synchronize_api(_web_endpoint, target_module=__name__)
23
+ fastapi_endpoint = synchronize_api(_fastapi_endpoint, target_module=__name__)
22
24
  asgi_app = synchronize_api(_asgi_app, target_module=__name__)
23
25
  wsgi_app = synchronize_api(_wsgi_app, target_module=__name__)
24
26
  web_server = synchronize_api(_web_server, target_module=__name__)
@@ -13,7 +13,6 @@ class PartialFunction(
13
13
  flags: modal._partial_function._PartialFunctionFlags
14
14
  webhook_config: typing.Optional[modal_proto.api_pb2.WebhookConfig]
15
15
  is_generator: bool
16
- keep_warm: typing.Optional[int]
17
16
  batch_max_size: typing.Optional[int]
18
17
  batch_wait_ms: typing.Optional[int]
19
18
  force_build: bool
@@ -24,9 +23,9 @@ class PartialFunction(
24
23
  self,
25
24
  raw_f: collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType],
26
25
  flags: modal._partial_function._PartialFunctionFlags,
26
+ *,
27
27
  webhook_config: typing.Optional[modal_proto.api_pb2.WebhookConfig] = None,
28
28
  is_generator: typing.Optional[bool] = None,
29
- keep_warm: typing.Optional[int] = None,
30
29
  batch_max_size: typing.Optional[int] = None,
31
30
  batch_wait_ms: typing.Optional[int] = None,
32
31
  cluster_size: typing.Optional[int] = None,
@@ -44,10 +43,7 @@ class PartialFunction(
44
43
  def add_flags(self, flags) -> PartialFunction: ...
45
44
 
46
45
  def method(
47
- _warn_parentheses_missing=None,
48
- *,
49
- is_generator: typing.Optional[bool] = None,
50
- keep_warm: typing.Optional[int] = None,
46
+ _warn_parentheses_missing=None, *, is_generator: typing.Optional[bool] = None
51
47
  ) -> modal._partial_function._MethodDecoratorType: ...
52
48
  def web_endpoint(
53
49
  _warn_parentheses_missing=None,
@@ -61,6 +57,18 @@ def web_endpoint(
61
57
  [collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType]],
62
58
  PartialFunction[modal._partial_function.P, modal._partial_function.ReturnType, modal._partial_function.ReturnType],
63
59
  ]: ...
60
+ def fastapi_endpoint(
61
+ _warn_parentheses_missing=None,
62
+ *,
63
+ method: str = "GET",
64
+ label: typing.Optional[str] = None,
65
+ custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
66
+ docs: bool = False,
67
+ requires_proxy_auth: bool = False,
68
+ ) -> collections.abc.Callable[
69
+ [collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType]],
70
+ PartialFunction[modal._partial_function.P, modal._partial_function.ReturnType, modal._partial_function.ReturnType],
71
+ ]: ...
64
72
  def asgi_app(
65
73
  _warn_parentheses_missing=None,
66
74
  *,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: modal
3
- Version: 0.73.81
3
+ Version: 0.73.84
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
- modal/__init__.py,sha256=8tE3_OhuKF5UkP4dcmMe8NAbLNNJyuwJFNgDQRBgCig,2333
1
+ modal/__init__.py,sha256=KcoVQVCfwuHmIJ74OxQPn66MHfiJcWi8V5srBW12jTA,2464
2
2
  modal/__main__.py,sha256=CgIjP8m1xJjjd4AXc-delmR6LdBCZclw2A_V38CFIio,2870
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
@@ -8,7 +8,7 @@ modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
9
9
  modal/_object.py,sha256=ItQcsMNkz9Y3kdTsvfNarbW-paJ2qabDyQ7njaqY0XI,11359
10
10
  modal/_output.py,sha256=Z0nngPh2mKHMQc4MQ92YjVPc3ewOLa3I4dFBlL9nvQY,25656
11
- modal/_partial_function.py,sha256=5MKkd66aKB6NlFjnLCNidY4E6L2SDjmChp0ByYYV6sU,27881
11
+ modal/_partial_function.py,sha256=3rmdWxX2nmAJU4SSfhCE7IDHFNrKYHVVbuxBlK0cI_g,30023
12
12
  modal/_proxy_tunnel.py,sha256=gnKyCfmVB7x2d1A6c-JDysNIP3kEFxmXzhcXhPrzPn0,1906
13
13
  modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
14
14
  modal/_resolver.py,sha256=RtoXoYzSllPlFu0D1vel_FWiEmDO7RyToiC2bxeN8ZY,6917
@@ -18,11 +18,11 @@ modal/_traceback.py,sha256=IZQzB3fVlUfMHOSyKUgw0H6qv4yHnpyq-XVCNZKfUdA,5023
18
18
  modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
19
19
  modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
20
20
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
21
- modal/app.py,sha256=kF3frIt4eRKVYYCjusMMhKJpO_lDdm2z37HOXPwpjT8,45506
21
+ modal/app.py,sha256=PPYAQ7ts6PeJHcV2D5DWsJw-vfZzM4Rpnw7S2BNnEk8,45474
22
22
  modal/app.pyi,sha256=tZFbcsu20SuvfB2puxCyuXLFNJ9bQulzag55rVpgZmc,26827
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
25
- modal/client.pyi,sha256=nTyGF9yDiFVLdzSX_DFF5LGAH-PqxoY_6ZRX6hN4ODw,7593
25
+ modal/client.pyi,sha256=kCq-GfIM9Ahb4umbNkcEsLdhhxXnag6beolz8_FDzHw,7593
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
28
28
  modal/cls.py,sha256=5DjpSBP1IyROKZm5ItDiEGdbRnfTT6K1Ul0jEvEKw_Q,31695
@@ -56,8 +56,8 @@ modal/object.pyi,sha256=kyJkRQcVv3ct7zSAxvvXcuhBVeH914v80uSlqeS7cA4,5632
56
56
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
57
57
  modal/parallel_map.py,sha256=POBTyiWabe2e4qBNlsjjksiu1AAPEsNqI-mM8cgNFco,16042
58
58
  modal/parallel_map.pyi,sha256=-YKY_bVuQv8B4gtFrHnXtuNV0_JpmU9vqMJzR7beeCU,2524
59
- modal/partial_function.py,sha256=KkATL56zEe_Kzp4hDX0c0e6BrXeO8V8mZBjfIs_ldqI,1016
60
- modal/partial_function.pyi,sha256=RO76Hg9DAYHd1gW3ntPMucbUpvu19ZLZTRjtBSIwIV0,4541
59
+ modal/partial_function.py,sha256=uu8zvIV0Big0jiTlC4-VPL16dOScNB5jhfPeqxvvCrI,1117
60
+ modal/partial_function.pyi,sha256=-MAK61qJRi6Wjym-Measz5_9moJurYrJfdi7uSQZa5M,4936
61
61
  modal/proxy.py,sha256=NrOevrWxG3G7-zlyRzG6BcIvop7AWLeyahZxitbBaOk,1418
62
62
  modal/proxy.pyi,sha256=1OEKIVUyC-xb7fHMzngakQso0nTsK60TVhXtlcMj6Wk,390
63
63
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -168,10 +168,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
168
168
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
169
  modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
170
170
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
171
- modal_version/_version_generated.py,sha256=6ZSRrr6DXex_JOkeoVsVZjwFK4LTYXrAZvlvZT0uolE,149
172
- modal-0.73.81.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
173
- modal-0.73.81.dist-info/METADATA,sha256=yxfDvZoNZuehaLqU2nFgYWGTZRQdTVSIpzUr8rehM0I,2452
174
- modal-0.73.81.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
175
- modal-0.73.81.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
176
- modal-0.73.81.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
177
- modal-0.73.81.dist-info/RECORD,,
171
+ modal_version/_version_generated.py,sha256=6NDydGuk5jv_G-VRhREbufmsEGLmjLJXrOSb7BiQmXU,149
172
+ modal-0.73.84.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
173
+ modal-0.73.84.dist-info/METADATA,sha256=JE85zuzg-i__LiV5KWYnDyYeYI_3_5oELXrh2BMgFns,2452
174
+ modal-0.73.84.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
175
+ modal-0.73.84.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
176
+ modal-0.73.84.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
177
+ modal-0.73.84.dist-info/RECORD,,
@@ -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 = 81 # git: fa53b89
4
+ build_number = 84 # git: edebb02