modal 0.73.81__tar.gz → 0.73.83__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 (182) hide show
  1. {modal-0.73.81 → modal-0.73.83}/PKG-INFO +1 -1
  2. {modal-0.73.81 → modal-0.73.83}/modal/__init__.py +13 -1
  3. {modal-0.73.81 → modal-0.73.83}/modal/_partial_function.py +58 -0
  4. {modal-0.73.81 → modal-0.73.83}/modal/app.py +2 -2
  5. {modal-0.73.81 → modal-0.73.83}/modal/client.pyi +2 -2
  6. {modal-0.73.81 → modal-0.73.83}/modal/partial_function.py +2 -0
  7. {modal-0.73.81 → modal-0.73.83}/modal/partial_function.pyi +12 -0
  8. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-0.73.81 → modal-0.73.83}/modal_version/_version_generated.py +1 -1
  10. {modal-0.73.81 → modal-0.73.83}/LICENSE +0 -0
  11. {modal-0.73.81 → modal-0.73.83}/README.md +0 -0
  12. {modal-0.73.81 → modal-0.73.83}/modal/__main__.py +0 -0
  13. {modal-0.73.81 → modal-0.73.83}/modal/_clustered_functions.py +0 -0
  14. {modal-0.73.81 → modal-0.73.83}/modal/_clustered_functions.pyi +0 -0
  15. {modal-0.73.81 → modal-0.73.83}/modal/_container_entrypoint.py +0 -0
  16. {modal-0.73.81 → modal-0.73.83}/modal/_functions.py +0 -0
  17. {modal-0.73.81 → modal-0.73.83}/modal/_ipython.py +0 -0
  18. {modal-0.73.81 → modal-0.73.83}/modal/_location.py +0 -0
  19. {modal-0.73.81 → modal-0.73.83}/modal/_object.py +0 -0
  20. {modal-0.73.81 → modal-0.73.83}/modal/_output.py +0 -0
  21. {modal-0.73.81 → modal-0.73.83}/modal/_proxy_tunnel.py +0 -0
  22. {modal-0.73.81 → modal-0.73.83}/modal/_pty.py +0 -0
  23. {modal-0.73.81 → modal-0.73.83}/modal/_resolver.py +0 -0
  24. {modal-0.73.81 → modal-0.73.83}/modal/_resources.py +0 -0
  25. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/__init__.py +0 -0
  26. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/asgi.py +0 -0
  27. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/container_io_manager.py +0 -0
  28. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/container_io_manager.pyi +0 -0
  29. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/execution_context.py +0 -0
  30. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/execution_context.pyi +0 -0
  31. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  32. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/telemetry.py +0 -0
  33. {modal-0.73.81 → modal-0.73.83}/modal/_runtime/user_code_imports.py +0 -0
  34. {modal-0.73.81 → modal-0.73.83}/modal/_serialization.py +0 -0
  35. {modal-0.73.81 → modal-0.73.83}/modal/_traceback.py +0 -0
  36. {modal-0.73.81 → modal-0.73.83}/modal/_tunnel.py +0 -0
  37. {modal-0.73.81 → modal-0.73.83}/modal/_tunnel.pyi +0 -0
  38. {modal-0.73.81 → modal-0.73.83}/modal/_utils/__init__.py +0 -0
  39. {modal-0.73.81 → modal-0.73.83}/modal/_utils/app_utils.py +0 -0
  40. {modal-0.73.81 → modal-0.73.83}/modal/_utils/async_utils.py +0 -0
  41. {modal-0.73.81 → modal-0.73.83}/modal/_utils/blob_utils.py +0 -0
  42. {modal-0.73.81 → modal-0.73.83}/modal/_utils/bytes_io_segment_payload.py +0 -0
  43. {modal-0.73.81 → modal-0.73.83}/modal/_utils/deprecation.py +0 -0
  44. {modal-0.73.81 → modal-0.73.83}/modal/_utils/docker_utils.py +0 -0
  45. {modal-0.73.81 → modal-0.73.83}/modal/_utils/function_utils.py +0 -0
  46. {modal-0.73.81 → modal-0.73.83}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-0.73.81 → modal-0.73.83}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-0.73.81 → modal-0.73.83}/modal/_utils/hash_utils.py +0 -0
  49. {modal-0.73.81 → modal-0.73.83}/modal/_utils/http_utils.py +0 -0
  50. {modal-0.73.81 → modal-0.73.83}/modal/_utils/logger.py +0 -0
  51. {modal-0.73.81 → modal-0.73.83}/modal/_utils/mount_utils.py +0 -0
  52. {modal-0.73.81 → modal-0.73.83}/modal/_utils/name_utils.py +0 -0
  53. {modal-0.73.81 → modal-0.73.83}/modal/_utils/package_utils.py +0 -0
  54. {modal-0.73.81 → modal-0.73.83}/modal/_utils/pattern_utils.py +0 -0
  55. {modal-0.73.81 → modal-0.73.83}/modal/_utils/rand_pb_testing.py +0 -0
  56. {modal-0.73.81 → modal-0.73.83}/modal/_utils/shell_utils.py +0 -0
  57. {modal-0.73.81 → modal-0.73.83}/modal/_vendor/__init__.py +0 -0
  58. {modal-0.73.81 → modal-0.73.83}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  59. {modal-0.73.81 → modal-0.73.83}/modal/_vendor/cloudpickle.py +0 -0
  60. {modal-0.73.81 → modal-0.73.83}/modal/_vendor/tblib.py +0 -0
  61. {modal-0.73.81 → modal-0.73.83}/modal/_watcher.py +0 -0
  62. {modal-0.73.81 → modal-0.73.83}/modal/app.pyi +0 -0
  63. {modal-0.73.81 → modal-0.73.83}/modal/call_graph.py +0 -0
  64. {modal-0.73.81 → modal-0.73.83}/modal/cli/__init__.py +0 -0
  65. {modal-0.73.81 → modal-0.73.83}/modal/cli/_download.py +0 -0
  66. {modal-0.73.81 → modal-0.73.83}/modal/cli/_traceback.py +0 -0
  67. {modal-0.73.81 → modal-0.73.83}/modal/cli/app.py +0 -0
  68. {modal-0.73.81 → modal-0.73.83}/modal/cli/config.py +0 -0
  69. {modal-0.73.81 → modal-0.73.83}/modal/cli/container.py +0 -0
  70. {modal-0.73.81 → modal-0.73.83}/modal/cli/dict.py +0 -0
  71. {modal-0.73.81 → modal-0.73.83}/modal/cli/entry_point.py +0 -0
  72. {modal-0.73.81 → modal-0.73.83}/modal/cli/environment.py +0 -0
  73. {modal-0.73.81 → modal-0.73.83}/modal/cli/import_refs.py +0 -0
  74. {modal-0.73.81 → modal-0.73.83}/modal/cli/launch.py +0 -0
  75. {modal-0.73.81 → modal-0.73.83}/modal/cli/network_file_system.py +0 -0
  76. {modal-0.73.81 → modal-0.73.83}/modal/cli/profile.py +0 -0
  77. {modal-0.73.81 → modal-0.73.83}/modal/cli/programs/__init__.py +0 -0
  78. {modal-0.73.81 → modal-0.73.83}/modal/cli/programs/run_jupyter.py +0 -0
  79. {modal-0.73.81 → modal-0.73.83}/modal/cli/programs/vscode.py +0 -0
  80. {modal-0.73.81 → modal-0.73.83}/modal/cli/queues.py +0 -0
  81. {modal-0.73.81 → modal-0.73.83}/modal/cli/run.py +0 -0
  82. {modal-0.73.81 → modal-0.73.83}/modal/cli/secret.py +0 -0
  83. {modal-0.73.81 → modal-0.73.83}/modal/cli/token.py +0 -0
  84. {modal-0.73.81 → modal-0.73.83}/modal/cli/utils.py +0 -0
  85. {modal-0.73.81 → modal-0.73.83}/modal/cli/volume.py +0 -0
  86. {modal-0.73.81 → modal-0.73.83}/modal/client.py +0 -0
  87. {modal-0.73.81 → modal-0.73.83}/modal/cloud_bucket_mount.py +0 -0
  88. {modal-0.73.81 → modal-0.73.83}/modal/cloud_bucket_mount.pyi +0 -0
  89. {modal-0.73.81 → modal-0.73.83}/modal/cls.py +0 -0
  90. {modal-0.73.81 → modal-0.73.83}/modal/cls.pyi +0 -0
  91. {modal-0.73.81 → modal-0.73.83}/modal/config.py +0 -0
  92. {modal-0.73.81 → modal-0.73.83}/modal/container_process.py +0 -0
  93. {modal-0.73.81 → modal-0.73.83}/modal/container_process.pyi +0 -0
  94. {modal-0.73.81 → modal-0.73.83}/modal/dict.py +0 -0
  95. {modal-0.73.81 → modal-0.73.83}/modal/dict.pyi +0 -0
  96. {modal-0.73.81 → modal-0.73.83}/modal/environments.py +0 -0
  97. {modal-0.73.81 → modal-0.73.83}/modal/environments.pyi +0 -0
  98. {modal-0.73.81 → modal-0.73.83}/modal/exception.py +0 -0
  99. {modal-0.73.81 → modal-0.73.83}/modal/experimental.py +0 -0
  100. {modal-0.73.81 → modal-0.73.83}/modal/experimental.pyi +0 -0
  101. {modal-0.73.81 → modal-0.73.83}/modal/extensions/__init__.py +0 -0
  102. {modal-0.73.81 → modal-0.73.83}/modal/extensions/ipython.py +0 -0
  103. {modal-0.73.81 → modal-0.73.83}/modal/file_io.py +0 -0
  104. {modal-0.73.81 → modal-0.73.83}/modal/file_io.pyi +0 -0
  105. {modal-0.73.81 → modal-0.73.83}/modal/file_pattern_matcher.py +0 -0
  106. {modal-0.73.81 → modal-0.73.83}/modal/functions.py +0 -0
  107. {modal-0.73.81 → modal-0.73.83}/modal/functions.pyi +0 -0
  108. {modal-0.73.81 → modal-0.73.83}/modal/gpu.py +0 -0
  109. {modal-0.73.81 → modal-0.73.83}/modal/image.py +0 -0
  110. {modal-0.73.81 → modal-0.73.83}/modal/image.pyi +0 -0
  111. {modal-0.73.81 → modal-0.73.83}/modal/io_streams.py +0 -0
  112. {modal-0.73.81 → modal-0.73.83}/modal/io_streams.pyi +0 -0
  113. {modal-0.73.81 → modal-0.73.83}/modal/mount.py +0 -0
  114. {modal-0.73.81 → modal-0.73.83}/modal/mount.pyi +0 -0
  115. {modal-0.73.81 → modal-0.73.83}/modal/network_file_system.py +0 -0
  116. {modal-0.73.81 → modal-0.73.83}/modal/network_file_system.pyi +0 -0
  117. {modal-0.73.81 → modal-0.73.83}/modal/object.py +0 -0
  118. {modal-0.73.81 → modal-0.73.83}/modal/object.pyi +0 -0
  119. {modal-0.73.81 → modal-0.73.83}/modal/output.py +0 -0
  120. {modal-0.73.81 → modal-0.73.83}/modal/parallel_map.py +0 -0
  121. {modal-0.73.81 → modal-0.73.83}/modal/parallel_map.pyi +0 -0
  122. {modal-0.73.81 → modal-0.73.83}/modal/proxy.py +0 -0
  123. {modal-0.73.81 → modal-0.73.83}/modal/proxy.pyi +0 -0
  124. {modal-0.73.81 → modal-0.73.83}/modal/py.typed +0 -0
  125. {modal-0.73.81 → modal-0.73.83}/modal/queue.py +0 -0
  126. {modal-0.73.81 → modal-0.73.83}/modal/queue.pyi +0 -0
  127. {modal-0.73.81 → modal-0.73.83}/modal/requirements/2023.12.312.txt +0 -0
  128. {modal-0.73.81 → modal-0.73.83}/modal/requirements/2023.12.txt +0 -0
  129. {modal-0.73.81 → modal-0.73.83}/modal/requirements/2024.04.txt +0 -0
  130. {modal-0.73.81 → modal-0.73.83}/modal/requirements/2024.10.txt +0 -0
  131. {modal-0.73.81 → modal-0.73.83}/modal/requirements/README.md +0 -0
  132. {modal-0.73.81 → modal-0.73.83}/modal/requirements/base-images.json +0 -0
  133. {modal-0.73.81 → modal-0.73.83}/modal/retries.py +0 -0
  134. {modal-0.73.81 → modal-0.73.83}/modal/runner.py +0 -0
  135. {modal-0.73.81 → modal-0.73.83}/modal/runner.pyi +0 -0
  136. {modal-0.73.81 → modal-0.73.83}/modal/running_app.py +0 -0
  137. {modal-0.73.81 → modal-0.73.83}/modal/sandbox.py +0 -0
  138. {modal-0.73.81 → modal-0.73.83}/modal/sandbox.pyi +0 -0
  139. {modal-0.73.81 → modal-0.73.83}/modal/schedule.py +0 -0
  140. {modal-0.73.81 → modal-0.73.83}/modal/scheduler_placement.py +0 -0
  141. {modal-0.73.81 → modal-0.73.83}/modal/secret.py +0 -0
  142. {modal-0.73.81 → modal-0.73.83}/modal/secret.pyi +0 -0
  143. {modal-0.73.81 → modal-0.73.83}/modal/serving.py +0 -0
  144. {modal-0.73.81 → modal-0.73.83}/modal/serving.pyi +0 -0
  145. {modal-0.73.81 → modal-0.73.83}/modal/snapshot.py +0 -0
  146. {modal-0.73.81 → modal-0.73.83}/modal/snapshot.pyi +0 -0
  147. {modal-0.73.81 → modal-0.73.83}/modal/stream_type.py +0 -0
  148. {modal-0.73.81 → modal-0.73.83}/modal/token_flow.py +0 -0
  149. {modal-0.73.81 → modal-0.73.83}/modal/token_flow.pyi +0 -0
  150. {modal-0.73.81 → modal-0.73.83}/modal/volume.py +0 -0
  151. {modal-0.73.81 → modal-0.73.83}/modal/volume.pyi +0 -0
  152. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/SOURCES.txt +0 -0
  153. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/dependency_links.txt +0 -0
  154. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/entry_points.txt +0 -0
  155. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/requires.txt +0 -0
  156. {modal-0.73.81 → modal-0.73.83}/modal.egg-info/top_level.txt +0 -0
  157. {modal-0.73.81 → modal-0.73.83}/modal_docs/__init__.py +0 -0
  158. {modal-0.73.81 → modal-0.73.83}/modal_docs/gen_cli_docs.py +0 -0
  159. {modal-0.73.81 → modal-0.73.83}/modal_docs/gen_reference_docs.py +0 -0
  160. {modal-0.73.81 → modal-0.73.83}/modal_docs/mdmd/__init__.py +0 -0
  161. {modal-0.73.81 → modal-0.73.83}/modal_docs/mdmd/mdmd.py +0 -0
  162. {modal-0.73.81 → modal-0.73.83}/modal_docs/mdmd/signatures.py +0 -0
  163. {modal-0.73.81 → modal-0.73.83}/modal_proto/__init__.py +0 -0
  164. {modal-0.73.81 → modal-0.73.83}/modal_proto/api.proto +0 -0
  165. {modal-0.73.81 → modal-0.73.83}/modal_proto/api_grpc.py +0 -0
  166. {modal-0.73.81 → modal-0.73.83}/modal_proto/api_pb2.py +0 -0
  167. {modal-0.73.81 → modal-0.73.83}/modal_proto/api_pb2.pyi +0 -0
  168. {modal-0.73.81 → modal-0.73.83}/modal_proto/api_pb2_grpc.py +0 -0
  169. {modal-0.73.81 → modal-0.73.83}/modal_proto/api_pb2_grpc.pyi +0 -0
  170. {modal-0.73.81 → modal-0.73.83}/modal_proto/modal_api_grpc.py +0 -0
  171. {modal-0.73.81 → modal-0.73.83}/modal_proto/modal_options_grpc.py +0 -0
  172. {modal-0.73.81 → modal-0.73.83}/modal_proto/options.proto +0 -0
  173. {modal-0.73.81 → modal-0.73.83}/modal_proto/options_grpc.py +0 -0
  174. {modal-0.73.81 → modal-0.73.83}/modal_proto/options_pb2.py +0 -0
  175. {modal-0.73.81 → modal-0.73.83}/modal_proto/options_pb2.pyi +0 -0
  176. {modal-0.73.81 → modal-0.73.83}/modal_proto/options_pb2_grpc.py +0 -0
  177. {modal-0.73.81 → modal-0.73.83}/modal_proto/options_pb2_grpc.pyi +0 -0
  178. {modal-0.73.81 → modal-0.73.83}/modal_proto/py.typed +0 -0
  179. {modal-0.73.81 → modal-0.73.83}/modal_version/__init__.py +0 -0
  180. {modal-0.73.81 → modal-0.73.83}/modal_version/__main__.py +0 -0
  181. {modal-0.73.81 → modal-0.73.83}/pyproject.toml +0 -0
  182. {modal-0.73.81 → modal-0.73.83}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: modal
3
- Version: 0.73.81
3
+ Version: 0.73.83
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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",
@@ -256,6 +256,64 @@ def _parse_custom_domains(custom_domains: Optional[Iterable[str]] = None) -> lis
256
256
  return _custom_domains
257
257
 
258
258
 
259
+ def _fastapi_endpoint(
260
+ _warn_parentheses_missing=None,
261
+ *,
262
+ method: str = "GET", # REST method for the created endpoint.
263
+ label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
264
+ custom_domains: Optional[Iterable[str]] = None, # Custom fully-qualified domain name (FQDN) for the endpoint.
265
+ docs: bool = False, # Whether to enable interactive documentation for this endpoint at /docs.
266
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
267
+ ) -> Callable[[Callable[P, ReturnType]], _PartialFunction[P, ReturnType, ReturnType]]:
268
+ """Register a basic web endpoint with this application.
269
+
270
+ This is the simple way to create a web endpoint on Modal. The function
271
+ behaves as a [FastAPI](https://fastapi.tiangolo.com/) handler and should
272
+ return a response object to the caller.
273
+
274
+ Endpoints created with `@app.fastapi_endpoint` are meant to be simple, single
275
+ request handlers and automatically have
276
+ [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) enabled.
277
+ For more flexibility, use `@app.asgi_app`.
278
+
279
+ To learn how to use Modal with popular web frameworks, see the
280
+ [guide on web endpoints](https://modal.com/docs/guide/webhooks).
281
+
282
+ This function replaces the deprecated `@web_endpoint` decorator.
283
+ """
284
+ if isinstance(_warn_parentheses_missing, str):
285
+ # Probably passing the method string as a positional argument.
286
+ raise InvalidError('Positional arguments are not allowed. Suggestion: `@fastapi_endpoint(method="GET")`.')
287
+ elif _warn_parentheses_missing is not None:
288
+ raise InvalidError(
289
+ "Positional arguments are not allowed. Did you forget parentheses? Suggestion: `@fastapi_endpoint()`."
290
+ )
291
+
292
+ def wrapper(raw_f: Callable[..., Any]) -> _PartialFunction:
293
+ if isinstance(raw_f, _Function):
294
+ raw_f = raw_f.get_raw_f()
295
+ raise InvalidError(
296
+ f"Applying decorators for {raw_f} in the wrong order!\nUsage:\n\n"
297
+ "@app.function()\n@app.fastapi_endpoint()\ndef my_webhook():\n ..."
298
+ )
299
+
300
+ return _PartialFunction(
301
+ raw_f,
302
+ _PartialFunctionFlags.FUNCTION,
303
+ api_pb2.WebhookConfig(
304
+ type=api_pb2.WEBHOOK_TYPE_FUNCTION,
305
+ method=method,
306
+ web_endpoint_docs=docs,
307
+ requested_suffix=label or "",
308
+ async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
309
+ custom_domains=_parse_custom_domains(custom_domains),
310
+ requires_proxy_auth=requires_proxy_auth,
311
+ ),
312
+ )
313
+
314
+ return wrapper
315
+
316
+
259
317
  def _web_endpoint(
260
318
  _warn_parentheses_missing=None,
261
319
  *,
@@ -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"
@@ -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.83"
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.83"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
@@ -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__)
@@ -61,6 +61,18 @@ def web_endpoint(
61
61
  [collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType]],
62
62
  PartialFunction[modal._partial_function.P, modal._partial_function.ReturnType, modal._partial_function.ReturnType],
63
63
  ]: ...
64
+ def fastapi_endpoint(
65
+ _warn_parentheses_missing=None,
66
+ *,
67
+ method: str = "GET",
68
+ label: typing.Optional[str] = None,
69
+ custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
70
+ docs: bool = False,
71
+ requires_proxy_auth: bool = False,
72
+ ) -> collections.abc.Callable[
73
+ [collections.abc.Callable[modal._partial_function.P, modal._partial_function.ReturnType]],
74
+ PartialFunction[modal._partial_function.P, modal._partial_function.ReturnType, modal._partial_function.ReturnType],
75
+ ]: ...
64
76
  def asgi_app(
65
77
  _warn_parentheses_missing=None,
66
78
  *,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: modal
3
- Version: 0.73.81
3
+ Version: 0.73.83
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 = 81 # git: fa53b89
4
+ build_number = 83 # git: a4a605c
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
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