fal 1.13.2__tar.gz → 1.13.4__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 (175) hide show
  1. {fal-1.13.2/fal.egg-info → fal-1.13.4}/PKG-INFO +1 -1
  2. {fal-1.13.2 → fal-1.13.4/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.13.2 → fal-1.13.4}/src/fal/_fal_version.py +2 -2
  4. {fal-1.13.2 → fal-1.13.4}/src/fal/app.py +19 -1
  5. {fal-1.13.2 → fal-1.13.4}/src/fal/exceptions/_cuda.py +3 -0
  6. {fal-1.13.2 → fal-1.13.4}/tests/test_apps.py +38 -0
  7. {fal-1.13.2 → fal-1.13.4}/.gitignore +0 -0
  8. {fal-1.13.2 → fal-1.13.4}/Makefile +0 -0
  9. {fal-1.13.2 → fal-1.13.4}/README.md +0 -0
  10. {fal-1.13.2 → fal-1.13.4}/docs/conf.py +0 -0
  11. {fal-1.13.2 → fal-1.13.4}/docs/index.rst +0 -0
  12. {fal-1.13.2 → fal-1.13.4}/fal.egg-info/SOURCES.txt +0 -0
  13. {fal-1.13.2 → fal-1.13.4}/fal.egg-info/dependency_links.txt +0 -0
  14. {fal-1.13.2 → fal-1.13.4}/fal.egg-info/entry_points.txt +0 -0
  15. {fal-1.13.2 → fal-1.13.4}/fal.egg-info/requires.txt +0 -0
  16. {fal-1.13.2 → fal-1.13.4}/fal.egg-info/top_level.txt +0 -0
  17. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/README.md +0 -0
  18. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  19. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  20. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  21. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  22. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  23. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  24. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  25. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  26. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  27. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  28. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  29. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  30. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  31. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  32. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  33. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  34. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  35. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  36. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  37. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  38. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  39. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  40. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  41. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  42. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  43. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  44. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  45. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  46. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  47. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  48. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  49. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  50. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  51. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  52. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  53. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  54. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  55. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  56. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  57. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  58. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  59. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  60. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  61. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  62. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  63. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  64. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  65. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  66. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  67. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  68. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  69. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  70. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  71. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  72. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  73. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  74. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  75. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  76. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  77. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  78. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  79. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  80. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  81. {fal-1.13.2 → fal-1.13.4}/openapi-fal-rest/pyproject.toml +0 -0
  82. {fal-1.13.2 → fal-1.13.4}/openapi_rest.config.yaml +0 -0
  83. {fal-1.13.2 → fal-1.13.4}/pyproject.toml +0 -0
  84. {fal-1.13.2 → fal-1.13.4}/setup.cfg +0 -0
  85. {fal-1.13.2 → fal-1.13.4}/src/fal/__init__.py +0 -0
  86. {fal-1.13.2 → fal-1.13.4}/src/fal/__main__.py +0 -0
  87. {fal-1.13.2 → fal-1.13.4}/src/fal/_serialization.py +0 -0
  88. {fal-1.13.2 → fal-1.13.4}/src/fal/_version.py +0 -0
  89. {fal-1.13.2 → fal-1.13.4}/src/fal/api.py +0 -0
  90. {fal-1.13.2 → fal-1.13.4}/src/fal/apps.py +0 -0
  91. {fal-1.13.2 → fal-1.13.4}/src/fal/auth/__init__.py +0 -0
  92. {fal-1.13.2 → fal-1.13.4}/src/fal/auth/auth0.py +0 -0
  93. {fal-1.13.2 → fal-1.13.4}/src/fal/auth/local.py +0 -0
  94. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/__init__.py +0 -0
  95. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/_utils.py +0 -0
  96. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/api.py +0 -0
  97. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/apps.py +0 -0
  98. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/auth.py +0 -0
  99. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/cli_nested_json.py +0 -0
  100. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/create.py +0 -0
  101. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/debug.py +0 -0
  102. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/deploy.py +0 -0
  103. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/doctor.py +0 -0
  104. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/keys.py +0 -0
  105. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/main.py +0 -0
  106. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/parser.py +0 -0
  107. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/profile.py +0 -0
  108. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/run.py +0 -0
  109. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/runners.py +0 -0
  110. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/secrets.py +0 -0
  111. {fal-1.13.2 → fal-1.13.4}/src/fal/cli/teams.py +0 -0
  112. {fal-1.13.2 → fal-1.13.4}/src/fal/config.py +0 -0
  113. {fal-1.13.2 → fal-1.13.4}/src/fal/console/__init__.py +0 -0
  114. {fal-1.13.2 → fal-1.13.4}/src/fal/console/icons.py +0 -0
  115. {fal-1.13.2 → fal-1.13.4}/src/fal/console/ux.py +0 -0
  116. {fal-1.13.2 → fal-1.13.4}/src/fal/container.py +0 -0
  117. {fal-1.13.2 → fal-1.13.4}/src/fal/exceptions/__init__.py +0 -0
  118. {fal-1.13.2 → fal-1.13.4}/src/fal/exceptions/_base.py +0 -0
  119. {fal-1.13.2 → fal-1.13.4}/src/fal/exceptions/auth.py +0 -0
  120. {fal-1.13.2 → fal-1.13.4}/src/fal/files.py +0 -0
  121. {fal-1.13.2 → fal-1.13.4}/src/fal/flags.py +0 -0
  122. {fal-1.13.2 → fal-1.13.4}/src/fal/logging/__init__.py +0 -0
  123. {fal-1.13.2 → fal-1.13.4}/src/fal/logging/isolate.py +0 -0
  124. {fal-1.13.2 → fal-1.13.4}/src/fal/logging/style.py +0 -0
  125. {fal-1.13.2 → fal-1.13.4}/src/fal/logging/trace.py +0 -0
  126. {fal-1.13.2 → fal-1.13.4}/src/fal/logging/user.py +0 -0
  127. {fal-1.13.2 → fal-1.13.4}/src/fal/py.typed +0 -0
  128. {fal-1.13.2 → fal-1.13.4}/src/fal/rest_client.py +0 -0
  129. {fal-1.13.2 → fal-1.13.4}/src/fal/sdk.py +0 -0
  130. {fal-1.13.2 → fal-1.13.4}/src/fal/sync.py +0 -0
  131. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/__init__.py +0 -0
  132. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/exceptions.py +0 -0
  133. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/__init__.py +0 -0
  134. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/file.py +0 -0
  135. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/providers/fal.py +0 -0
  136. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/providers/gcp.py +0 -0
  137. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/providers/r2.py +0 -0
  138. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/providers/s3.py +0 -0
  139. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/file/types.py +0 -0
  140. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/__init__.py +0 -0
  141. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/image.py +0 -0
  142. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  143. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  144. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  145. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  146. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  147. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/image/safety_checker.py +0 -0
  148. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/optimize.py +0 -0
  149. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/types.py +0 -0
  150. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/utils/__init__.py +0 -0
  151. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/utils/download_utils.py +0 -0
  152. {fal-1.13.2 → fal-1.13.4}/src/fal/toolkit/utils/retry.py +0 -0
  153. {fal-1.13.2 → fal-1.13.4}/src/fal/utils.py +0 -0
  154. {fal-1.13.2 → fal-1.13.4}/src/fal/workflows.py +0 -0
  155. {fal-1.13.2 → fal-1.13.4}/tests/__init__.py +0 -0
  156. {fal-1.13.2 → fal-1.13.4}/tests/assets/cat.png +0 -0
  157. {fal-1.13.2 → fal-1.13.4}/tests/cli/__init__.py +0 -0
  158. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_apps.py +0 -0
  159. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_auth.py +0 -0
  160. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_deploy.py +0 -0
  161. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_keys.py +0 -0
  162. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_run.py +0 -0
  163. {fal-1.13.2 → fal-1.13.4}/tests/cli/test_secrets.py +0 -0
  164. {fal-1.13.2 → fal-1.13.4}/tests/conftest.py +0 -0
  165. {fal-1.13.2 → fal-1.13.4}/tests/integration_test.py +0 -0
  166. {fal-1.13.2 → fal-1.13.4}/tests/mainify_package/__init__.py +0 -0
  167. {fal-1.13.2 → fal-1.13.4}/tests/mainify_package/impl.py +0 -0
  168. {fal-1.13.2 → fal-1.13.4}/tests/mainify_package/utils.py +0 -0
  169. {fal-1.13.2 → fal-1.13.4}/tests/mainify_target.py +0 -0
  170. {fal-1.13.2 → fal-1.13.4}/tests/test_stability.py +0 -0
  171. {fal-1.13.2 → fal-1.13.4}/tests/toolkit/file_test.py +0 -0
  172. {fal-1.13.2 → fal-1.13.4}/tests/toolkit/image_test.py +0 -0
  173. {fal-1.13.2 → fal-1.13.4}/tests/toolkit/test_types.py +0 -0
  174. {fal-1.13.2 → fal-1.13.4}/tests/toolkit/utils/retry.py +0 -0
  175. {fal-1.13.2 → fal-1.13.4}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.13.2
3
+ Version: 1.13.4
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.4
2
2
  Name: fal
3
- Version: 1.13.2
3
+ Version: 1.13.4
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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.13.2'
21
- __version_tuple__ = version_tuple = (1, 13, 2)
20
+ __version__ = version = '1.13.4'
21
+ __version_tuple__ = version_tuple = (1, 13, 4)
@@ -345,7 +345,25 @@ class App(BaseServable):
345
345
  async def provide_hints_headers(request, call_next):
346
346
  response = await call_next(request)
347
347
  try:
348
- response.headers["X-Fal-Runner-Hints"] = ",".join(self.provide_hints())
348
+ # make sure the hints can be encoded in latin-1, so we don't crash
349
+ # when serving.
350
+ # https://github.com/encode/starlette/blob/a766a58d14007f07c0b5782fa78cdc370b892796/starlette/datastructures.py#L568
351
+ hints = []
352
+ for hint in self.provide_hints():
353
+ try:
354
+ _ = hint.encode("latin-1")
355
+ hints.append(hint)
356
+ except UnicodeEncodeError:
357
+ from fastapi.logger import logger
358
+
359
+ logger.warning(
360
+ "Ignoring hint %s for %s because it can't be encoded in "
361
+ "latin-1",
362
+ hint,
363
+ self.__class__.__name__,
364
+ )
365
+
366
+ response.headers["X-Fal-Runner-Hints"] = ",".join(hints)
349
367
  except NotImplementedError:
350
368
  # This lets us differentiate between apps that don't provide hints
351
369
  # and apps that provide empty hints.
@@ -38,6 +38,9 @@ def _is_cuda_out_of_memory(exception: BaseException) -> bool:
38
38
  if "NVML_SUCCESS == r INTERNAL ASSERT FAILED" in msg:
39
39
  return True
40
40
 
41
+ if "CUDNN_STATUS_INTERNAL_ERROR" in msg:
42
+ return True
43
+
41
44
  return False
42
45
 
43
46
 
@@ -223,6 +223,10 @@ class ExceptionApp(fal.App, keep_alive=300, max_concurrency=1):
223
223
  # https://github.com/pytorch/pytorch/issues/112377
224
224
  raise RuntimeError("NVML_SUCCESS == r INTERNAL ASSERT FAILED")
225
225
 
226
+ @fal.endpoint("/cuda-exception-3")
227
+ def cuda_exception_3(self) -> Output:
228
+ raise RuntimeError("cuDNN error: CUDNN_STATUS_INTERNAL_ERROR")
229
+
226
230
 
227
231
  class CancellableApp(fal.App, keep_alive=300, max_concurrency=1):
228
232
  task = None
@@ -910,6 +914,12 @@ def test_app_exceptions(test_exception_app: AppClient):
910
914
  assert cuda_exc.value.status_code == _CUDA_OOM_STATUS_CODE
911
915
  assert _CUDA_OOM_MESSAGE in cuda_exc.value.message
912
916
 
917
+ with pytest.raises(AppClientError) as cuda_exc:
918
+ test_exception_app.cuda_exception_3({})
919
+
920
+ assert cuda_exc.value.status_code == _CUDA_OOM_STATUS_CODE
921
+ assert _CUDA_OOM_MESSAGE in cuda_exc.value.message
922
+
913
923
 
914
924
  def test_kill_runner():
915
925
  app_alias = str(uuid.uuid4()) + "-sleep-alias"
@@ -956,3 +966,31 @@ def test_container_app_client(test_container_app: str):
956
966
  def test_container_build_args_app_client(test_container_build_args_app: str):
957
967
  response = apps.run(test_container_build_args_app, {})
958
968
  assert response == "built with build args"
969
+
970
+
971
+ class HintsApp(fal.App, keep_alive=300, max_concurrency=1):
972
+ machine_type = "S"
973
+
974
+ def provide_hints(self) -> List[str]:
975
+ return ["é", "😀"]
976
+
977
+ @fal.endpoint("/add")
978
+ def add(self, input: Input) -> Output:
979
+ return Output(result=input.lhs + input.rhs)
980
+
981
+
982
+ def test_hints_encoding():
983
+ """
984
+ Make sure that hints that can't be encoded in latin-1 don't crash the app
985
+ https://github.com/encode/starlette/blob/a766a58d14007f07c0b5782fa78cdc370b892796/starlette/datastructures.py#L568
986
+ """
987
+ with AppClient.connect(HintsApp) as client:
988
+ with httpx.Client() as httpx_client:
989
+ url = client.url + "/add"
990
+ resp = httpx_client.post(
991
+ url,
992
+ json={"lhs": 1, "rhs": 2},
993
+ timeout=30,
994
+ )
995
+ assert resp.is_success
996
+ assert resp.json()["result"] == 3
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