fal 1.5.12__tar.gz → 1.5.13__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.

Potentially problematic release.


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

Files changed (167) hide show
  1. {fal-1.5.12/fal.egg-info → fal-1.5.13}/PKG-INFO +1 -1
  2. {fal-1.5.12 → fal-1.5.13/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.5.12 → fal-1.5.13}/src/fal/_fal_version.py +2 -2
  4. {fal-1.5.12 → fal-1.5.13}/src/fal/app.py +32 -11
  5. {fal-1.5.12 → fal-1.5.13}/tests/test_apps.py +1 -1
  6. {fal-1.5.12 → fal-1.5.13}/.gitignore +0 -0
  7. {fal-1.5.12 → fal-1.5.13}/Makefile +0 -0
  8. {fal-1.5.12 → fal-1.5.13}/README.md +0 -0
  9. {fal-1.5.12 → fal-1.5.13}/docs/conf.py +0 -0
  10. {fal-1.5.12 → fal-1.5.13}/docs/index.rst +0 -0
  11. {fal-1.5.12 → fal-1.5.13}/fal.egg-info/SOURCES.txt +0 -0
  12. {fal-1.5.12 → fal-1.5.13}/fal.egg-info/dependency_links.txt +0 -0
  13. {fal-1.5.12 → fal-1.5.13}/fal.egg-info/entry_points.txt +0 -0
  14. {fal-1.5.12 → fal-1.5.13}/fal.egg-info/requires.txt +0 -0
  15. {fal-1.5.12 → fal-1.5.13}/fal.egg-info/top_level.txt +0 -0
  16. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/README.md +0 -0
  17. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  18. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  19. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  20. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  21. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  22. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  23. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  24. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  25. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  26. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  27. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  28. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  29. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  30. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  31. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  32. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  33. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  34. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  35. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  36. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  37. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  38. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  39. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  40. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  41. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  42. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  43. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  44. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  45. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  46. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  47. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  48. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  49. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  50. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  51. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  52. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  53. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  54. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  55. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  56. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  57. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  58. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  59. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  60. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  61. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  62. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  63. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  64. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  65. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  66. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  67. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  68. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  69. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  70. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  71. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  72. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  73. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  74. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  75. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  76. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  77. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  78. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  79. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  80. {fal-1.5.12 → fal-1.5.13}/openapi-fal-rest/pyproject.toml +0 -0
  81. {fal-1.5.12 → fal-1.5.13}/openapi_rest.config.yaml +0 -0
  82. {fal-1.5.12 → fal-1.5.13}/pyproject.toml +0 -0
  83. {fal-1.5.12 → fal-1.5.13}/setup.cfg +0 -0
  84. {fal-1.5.12 → fal-1.5.13}/src/fal/__init__.py +0 -0
  85. {fal-1.5.12 → fal-1.5.13}/src/fal/__main__.py +0 -0
  86. {fal-1.5.12 → fal-1.5.13}/src/fal/_serialization.py +0 -0
  87. {fal-1.5.12 → fal-1.5.13}/src/fal/_version.py +0 -0
  88. {fal-1.5.12 → fal-1.5.13}/src/fal/api.py +0 -0
  89. {fal-1.5.12 → fal-1.5.13}/src/fal/apps.py +0 -0
  90. {fal-1.5.12 → fal-1.5.13}/src/fal/auth/__init__.py +0 -0
  91. {fal-1.5.12 → fal-1.5.13}/src/fal/auth/auth0.py +0 -0
  92. {fal-1.5.12 → fal-1.5.13}/src/fal/auth/local.py +0 -0
  93. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/__init__.py +0 -0
  94. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/_utils.py +0 -0
  95. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/apps.py +0 -0
  96. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/auth.py +0 -0
  97. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/create.py +0 -0
  98. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/debug.py +0 -0
  99. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/deploy.py +0 -0
  100. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/doctor.py +0 -0
  101. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/keys.py +0 -0
  102. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/main.py +0 -0
  103. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/parser.py +0 -0
  104. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/run.py +0 -0
  105. {fal-1.5.12 → fal-1.5.13}/src/fal/cli/secrets.py +0 -0
  106. {fal-1.5.12 → fal-1.5.13}/src/fal/console/__init__.py +0 -0
  107. {fal-1.5.12 → fal-1.5.13}/src/fal/console/icons.py +0 -0
  108. {fal-1.5.12 → fal-1.5.13}/src/fal/console/ux.py +0 -0
  109. {fal-1.5.12 → fal-1.5.13}/src/fal/container.py +0 -0
  110. {fal-1.5.12 → fal-1.5.13}/src/fal/exceptions/__init__.py +0 -0
  111. {fal-1.5.12 → fal-1.5.13}/src/fal/exceptions/_base.py +0 -0
  112. {fal-1.5.12 → fal-1.5.13}/src/fal/exceptions/_cuda.py +0 -0
  113. {fal-1.5.12 → fal-1.5.13}/src/fal/exceptions/auth.py +0 -0
  114. {fal-1.5.12 → fal-1.5.13}/src/fal/files.py +0 -0
  115. {fal-1.5.12 → fal-1.5.13}/src/fal/flags.py +0 -0
  116. {fal-1.5.12 → fal-1.5.13}/src/fal/logging/__init__.py +0 -0
  117. {fal-1.5.12 → fal-1.5.13}/src/fal/logging/isolate.py +0 -0
  118. {fal-1.5.12 → fal-1.5.13}/src/fal/logging/style.py +0 -0
  119. {fal-1.5.12 → fal-1.5.13}/src/fal/logging/trace.py +0 -0
  120. {fal-1.5.12 → fal-1.5.13}/src/fal/logging/user.py +0 -0
  121. {fal-1.5.12 → fal-1.5.13}/src/fal/py.typed +0 -0
  122. {fal-1.5.12 → fal-1.5.13}/src/fal/rest_client.py +0 -0
  123. {fal-1.5.12 → fal-1.5.13}/src/fal/sdk.py +0 -0
  124. {fal-1.5.12 → fal-1.5.13}/src/fal/sync.py +0 -0
  125. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/__init__.py +0 -0
  126. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/exceptions.py +0 -0
  127. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/__init__.py +0 -0
  128. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/file.py +0 -0
  129. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/providers/fal.py +0 -0
  130. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/providers/gcp.py +0 -0
  131. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/providers/r2.py +0 -0
  132. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/providers/s3.py +0 -0
  133. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/file/types.py +0 -0
  134. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/__init__.py +0 -0
  135. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/image.py +0 -0
  136. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  137. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  138. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  139. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  140. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  141. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/image/safety_checker.py +0 -0
  142. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/optimize.py +0 -0
  143. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/utils/__init__.py +0 -0
  144. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/utils/download_utils.py +0 -0
  145. {fal-1.5.12 → fal-1.5.13}/src/fal/toolkit/utils/retry.py +0 -0
  146. {fal-1.5.12 → fal-1.5.13}/src/fal/utils.py +0 -0
  147. {fal-1.5.12 → fal-1.5.13}/src/fal/workflows.py +0 -0
  148. {fal-1.5.12 → fal-1.5.13}/tests/__init__.py +0 -0
  149. {fal-1.5.12 → fal-1.5.13}/tests/assets/cat.png +0 -0
  150. {fal-1.5.12 → fal-1.5.13}/tests/cli/__init__.py +0 -0
  151. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_apps.py +0 -0
  152. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_auth.py +0 -0
  153. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_deploy.py +0 -0
  154. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_keys.py +0 -0
  155. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_run.py +0 -0
  156. {fal-1.5.12 → fal-1.5.13}/tests/cli/test_secrets.py +0 -0
  157. {fal-1.5.12 → fal-1.5.13}/tests/conftest.py +0 -0
  158. {fal-1.5.12 → fal-1.5.13}/tests/integration_test.py +0 -0
  159. {fal-1.5.12 → fal-1.5.13}/tests/mainify_package/__init__.py +0 -0
  160. {fal-1.5.12 → fal-1.5.13}/tests/mainify_package/impl.py +0 -0
  161. {fal-1.5.12 → fal-1.5.13}/tests/mainify_package/utils.py +0 -0
  162. {fal-1.5.12 → fal-1.5.13}/tests/mainify_target.py +0 -0
  163. {fal-1.5.12 → fal-1.5.13}/tests/test_stability.py +0 -0
  164. {fal-1.5.12 → fal-1.5.13}/tests/toolkit/file_test.py +0 -0
  165. {fal-1.5.12 → fal-1.5.13}/tests/toolkit/image_test.py +0 -0
  166. {fal-1.5.12 → fal-1.5.13}/tests/toolkit/utils/retry.py +0 -0
  167. {fal-1.5.12 → fal-1.5.13}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.5.12
3
+ Version: 1.5.13
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.5.12
3
+ Version: 1.5.13
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels <support@fal.ai>
6
6
  Requires-Python: >=3.8
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.5.12'
16
- __version_tuple__ = version_tuple = (1, 5, 12)
15
+ __version__ = version = '1.5.13'
16
+ __version_tuple__ = version_tuple = (1, 5, 13)
@@ -13,9 +13,9 @@ from contextlib import AsyncExitStack, asynccontextmanager, contextmanager
13
13
  from dataclasses import dataclass
14
14
  from typing import Any, Callable, ClassVar, Literal, TypeVar
15
15
 
16
+ import fastapi
16
17
  import grpc.aio as async_grpc
17
18
  import httpx
18
- from fastapi import FastAPI
19
19
  from isolate.server import definitions
20
20
 
21
21
  import fal.api
@@ -304,7 +304,7 @@ class App(fal.api.BaseServable):
304
304
  }
305
305
 
306
306
  @asynccontextmanager
307
- async def lifespan(self, app: FastAPI):
307
+ async def lifespan(self, app: fastapi.FastAPI):
308
308
  await _call_any_fn(self.setup)
309
309
  try:
310
310
  yield
@@ -320,7 +320,7 @@ class App(fal.api.BaseServable):
320
320
  def teardown(self):
321
321
  """Teardown the application after serving."""
322
322
 
323
- def _add_extra_middlewares(self, app: FastAPI):
323
+ def _add_extra_middlewares(self, app: fastapi.FastAPI):
324
324
  @app.middleware("http")
325
325
  async def provide_hints_headers(request, call_next):
326
326
  response = await call_next(request)
@@ -361,6 +361,8 @@ class App(fal.api.BaseServable):
361
361
 
362
362
  @app.middleware("http")
363
363
  async def set_request_id(request, call_next):
364
+ # NOTE: Setting request_id is not supported for websocket/realtime endpoints
365
+
364
366
  if self.isolate_channel is None:
365
367
  grpc_port = os.environ.get("NOMAD_ALLOC_PORT_grpc")
366
368
  self.isolate_channel = await open_isolate_channel(
@@ -368,14 +370,33 @@ class App(fal.api.BaseServable):
368
370
  )
369
371
 
370
372
  request_id = request.headers.get(REQUEST_ID_KEY)
371
- if request_id is not None:
372
- await _set_logger_labels(
373
- {"fal_request_id": request_id}, channel=self.isolate_channel
374
- )
375
- try:
373
+ if request_id is None:
374
+ # Cut it short
376
375
  return await call_next(request)
377
- finally:
378
- await _set_logger_labels({}, channel=self.isolate_channel)
376
+
377
+ await _set_logger_labels(
378
+ {"fal_request_id": request_id}, channel=self.isolate_channel
379
+ )
380
+
381
+ async def _unset_at_end():
382
+ await _set_logger_labels({}, channel=self.isolate_channel) # type: ignore
383
+
384
+ try:
385
+ response: fastapi.responses.Response = await call_next(request)
386
+ except BaseException:
387
+ await _unset_at_end()
388
+ raise
389
+ else:
390
+ # We need to wait for the entire response to be sent before
391
+ # we can set the logger labels back to the default.
392
+ background_tasks = fastapi.BackgroundTasks()
393
+ background_tasks.add_task(_unset_at_end)
394
+ if response.background:
395
+ # We normally have no background tasks, but we should handle it
396
+ background_tasks.add_task(response.background)
397
+ response.background = background_tasks
398
+
399
+ return response
379
400
 
380
401
  @app.exception_handler(RequestCancelledException)
381
402
  async def value_error_exception_handler(
@@ -388,7 +409,7 @@ class App(fal.api.BaseServable):
388
409
  # the connection without receiving a response
389
410
  return JSONResponse({"detail": str(exc)}, 499)
390
411
 
391
- def _add_extra_routes(self, app: FastAPI):
412
+ def _add_extra_routes(self, app: fastapi.FastAPI):
392
413
  @app.get("/health")
393
414
  def health():
394
415
  return self.health()
@@ -513,7 +513,7 @@ def test_app_no_serve_spec_metadata(
513
513
 
514
514
 
515
515
  def test_404_response(test_app: str, request: pytest.FixtureRequest):
516
- with pytest.raises(HTTPStatusError, match="Path /other not found"):
516
+ with pytest.raises(HTTPStatusError, match="Path /.*other not found"):
517
517
  apps.run(test_app, path="/other", arguments={"lhs": 1, "rhs": 2})
518
518
 
519
519
 
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