fal 1.5.9__tar.gz → 1.5.11__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.9/fal.egg-info → fal-1.5.11}/PKG-INFO +2 -2
  2. {fal-1.5.9 → fal-1.5.11/fal.egg-info}/PKG-INFO +2 -2
  3. {fal-1.5.9 → fal-1.5.11}/fal.egg-info/requires.txt +1 -1
  4. {fal-1.5.9 → fal-1.5.11}/pyproject.toml +1 -1
  5. {fal-1.5.9 → fal-1.5.11}/src/fal/_fal_version.py +2 -2
  6. {fal-1.5.9 → fal-1.5.11}/src/fal/app.py +10 -2
  7. {fal-1.5.9 → fal-1.5.11}/src/fal/apps.py +4 -2
  8. {fal-1.5.9 → fal-1.5.11}/src/fal/workflows.py +10 -4
  9. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_deploy.py +2 -2
  10. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_run.py +2 -1
  11. {fal-1.5.9 → fal-1.5.11}/tests/test_apps.py +8 -7
  12. {fal-1.5.9 → fal-1.5.11}/.gitignore +0 -0
  13. {fal-1.5.9 → fal-1.5.11}/Makefile +0 -0
  14. {fal-1.5.9 → fal-1.5.11}/README.md +0 -0
  15. {fal-1.5.9 → fal-1.5.11}/docs/conf.py +0 -0
  16. {fal-1.5.9 → fal-1.5.11}/docs/index.rst +0 -0
  17. {fal-1.5.9 → fal-1.5.11}/fal.egg-info/SOURCES.txt +0 -0
  18. {fal-1.5.9 → fal-1.5.11}/fal.egg-info/dependency_links.txt +0 -0
  19. {fal-1.5.9 → fal-1.5.11}/fal.egg-info/entry_points.txt +0 -0
  20. {fal-1.5.9 → fal-1.5.11}/fal.egg-info/top_level.txt +0 -0
  21. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/README.md +0 -0
  22. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  23. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  24. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  25. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  26. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  27. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  28. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  29. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  30. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  31. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  32. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  33. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  34. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  35. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  36. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  37. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  38. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  39. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  40. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  41. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  42. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  43. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  44. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  45. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  46. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  47. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  48. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  49. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  50. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  51. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  52. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  53. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  54. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  55. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  56. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  57. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  58. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  59. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  60. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  61. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  62. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  63. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  64. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  65. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  66. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  67. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  68. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  69. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  70. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  71. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  72. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  73. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  74. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  75. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  76. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  77. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  78. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  79. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  80. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  81. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  82. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  83. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  84. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  85. {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/pyproject.toml +0 -0
  86. {fal-1.5.9 → fal-1.5.11}/openapi_rest.config.yaml +0 -0
  87. {fal-1.5.9 → fal-1.5.11}/setup.cfg +0 -0
  88. {fal-1.5.9 → fal-1.5.11}/src/fal/__init__.py +0 -0
  89. {fal-1.5.9 → fal-1.5.11}/src/fal/__main__.py +0 -0
  90. {fal-1.5.9 → fal-1.5.11}/src/fal/_serialization.py +0 -0
  91. {fal-1.5.9 → fal-1.5.11}/src/fal/_version.py +0 -0
  92. {fal-1.5.9 → fal-1.5.11}/src/fal/api.py +0 -0
  93. {fal-1.5.9 → fal-1.5.11}/src/fal/auth/__init__.py +0 -0
  94. {fal-1.5.9 → fal-1.5.11}/src/fal/auth/auth0.py +0 -0
  95. {fal-1.5.9 → fal-1.5.11}/src/fal/auth/local.py +0 -0
  96. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/__init__.py +0 -0
  97. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/_utils.py +0 -0
  98. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/apps.py +0 -0
  99. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/auth.py +0 -0
  100. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/create.py +0 -0
  101. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/debug.py +0 -0
  102. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/deploy.py +0 -0
  103. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/doctor.py +0 -0
  104. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/keys.py +0 -0
  105. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/main.py +0 -0
  106. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/parser.py +0 -0
  107. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/run.py +0 -0
  108. {fal-1.5.9 → fal-1.5.11}/src/fal/cli/secrets.py +0 -0
  109. {fal-1.5.9 → fal-1.5.11}/src/fal/console/__init__.py +0 -0
  110. {fal-1.5.9 → fal-1.5.11}/src/fal/console/icons.py +0 -0
  111. {fal-1.5.9 → fal-1.5.11}/src/fal/console/ux.py +0 -0
  112. {fal-1.5.9 → fal-1.5.11}/src/fal/container.py +0 -0
  113. {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/__init__.py +0 -0
  114. {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/_base.py +0 -0
  115. {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/_cuda.py +0 -0
  116. {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/auth.py +0 -0
  117. {fal-1.5.9 → fal-1.5.11}/src/fal/files.py +0 -0
  118. {fal-1.5.9 → fal-1.5.11}/src/fal/flags.py +0 -0
  119. {fal-1.5.9 → fal-1.5.11}/src/fal/logging/__init__.py +0 -0
  120. {fal-1.5.9 → fal-1.5.11}/src/fal/logging/isolate.py +0 -0
  121. {fal-1.5.9 → fal-1.5.11}/src/fal/logging/style.py +0 -0
  122. {fal-1.5.9 → fal-1.5.11}/src/fal/logging/trace.py +0 -0
  123. {fal-1.5.9 → fal-1.5.11}/src/fal/logging/user.py +0 -0
  124. {fal-1.5.9 → fal-1.5.11}/src/fal/py.typed +0 -0
  125. {fal-1.5.9 → fal-1.5.11}/src/fal/rest_client.py +0 -0
  126. {fal-1.5.9 → fal-1.5.11}/src/fal/sdk.py +0 -0
  127. {fal-1.5.9 → fal-1.5.11}/src/fal/sync.py +0 -0
  128. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/__init__.py +0 -0
  129. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/exceptions.py +0 -0
  130. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/__init__.py +0 -0
  131. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/file.py +0 -0
  132. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/fal.py +0 -0
  133. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/gcp.py +0 -0
  134. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/r2.py +0 -0
  135. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/s3.py +0 -0
  136. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/types.py +0 -0
  137. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/__init__.py +0 -0
  138. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/image.py +0 -0
  139. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  140. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  141. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  142. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  143. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  144. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/safety_checker.py +0 -0
  145. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/optimize.py +0 -0
  146. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/__init__.py +0 -0
  147. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/download_utils.py +0 -0
  148. {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/retry.py +0 -0
  149. {fal-1.5.9 → fal-1.5.11}/src/fal/utils.py +0 -0
  150. {fal-1.5.9 → fal-1.5.11}/tests/__init__.py +0 -0
  151. {fal-1.5.9 → fal-1.5.11}/tests/assets/cat.png +0 -0
  152. {fal-1.5.9 → fal-1.5.11}/tests/cli/__init__.py +0 -0
  153. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_apps.py +0 -0
  154. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_auth.py +0 -0
  155. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_keys.py +0 -0
  156. {fal-1.5.9 → fal-1.5.11}/tests/cli/test_secrets.py +0 -0
  157. {fal-1.5.9 → fal-1.5.11}/tests/conftest.py +0 -0
  158. {fal-1.5.9 → fal-1.5.11}/tests/integration_test.py +0 -0
  159. {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/__init__.py +0 -0
  160. {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/impl.py +0 -0
  161. {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/utils.py +0 -0
  162. {fal-1.5.9 → fal-1.5.11}/tests/mainify_target.py +0 -0
  163. {fal-1.5.9 → fal-1.5.11}/tests/test_stability.py +0 -0
  164. {fal-1.5.9 → fal-1.5.11}/tests/toolkit/file_test.py +0 -0
  165. {fal-1.5.9 → fal-1.5.11}/tests/toolkit/image_test.py +0 -0
  166. {fal-1.5.9 → fal-1.5.11}/tests/toolkit/utils/retry.py +0 -0
  167. {fal-1.5.9 → fal-1.5.11}/tools/demo_script.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.5.9
3
+ Version: 1.5.11
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
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: isolate[build]<0.15.0,>=0.14.2
9
- Requires-Dist: isolate-proto==0.5.5
9
+ Requires-Dist: isolate-proto<0.7.0,>=0.6.0
10
10
  Requires-Dist: grpcio==1.64.0
11
11
  Requires-Dist: dill==0.3.7
12
12
  Requires-Dist: cloudpickle==3.0.0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.5.9
3
+ Version: 1.5.11
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
7
7
  Description-Content-Type: text/markdown
8
8
  Requires-Dist: isolate[build]<0.15.0,>=0.14.2
9
- Requires-Dist: isolate-proto==0.5.5
9
+ Requires-Dist: isolate-proto<0.7.0,>=0.6.0
10
10
  Requires-Dist: grpcio==1.64.0
11
11
  Requires-Dist: dill==0.3.7
12
12
  Requires-Dist: cloudpickle==3.0.0
@@ -1,5 +1,5 @@
1
1
  isolate[build]<0.15.0,>=0.14.2
2
- isolate-proto==0.5.5
2
+ isolate-proto<0.7.0,>=0.6.0
3
3
  grpcio==1.64.0
4
4
  dill==0.3.7
5
5
  cloudpickle==3.0.0
@@ -23,7 +23,7 @@ readme = "README.md"
23
23
  requires-python = ">=3.8"
24
24
  dependencies = [
25
25
  "isolate[build]>=0.14.2,<0.15.0",
26
- "isolate-proto==0.5.5",
26
+ "isolate-proto>=0.6.0,<0.7.0",
27
27
  "grpcio==1.64.0",
28
28
  "dill==0.3.7",
29
29
  "cloudpickle==3.0.0",
@@ -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.9'
16
- __version_tuple__ = version_tuple = (1, 5, 9)
15
+ __version__ = version = '1.5.11'
16
+ __version_tuple__ = version_tuple = (1, 5, 11)
@@ -69,6 +69,12 @@ async def _set_logger_labels(
69
69
  logger_labels: dict[str, str], channel: async_grpc.Channel
70
70
  ):
71
71
  try:
72
+ import sys
73
+
74
+ # Flush any prints that were buffered before setting the logger labels
75
+ sys.stderr.flush()
76
+ sys.stdout.flush()
77
+
72
78
  isolate = definitions.IsolateStub(channel)
73
79
  isolate_request = definitions.SetMetadataRequest(
74
80
  # TODO: when submit is shipped, get task_id from an env var
@@ -77,9 +83,11 @@ async def _set_logger_labels(
77
83
  )
78
84
  res = isolate.SetMetadata(isolate_request)
79
85
  code = await res.code()
80
- assert str(code) == "StatusCode.OK"
86
+ assert str(code) == "StatusCode.OK", str(code)
81
87
  except BaseException:
82
- logger.debug("Failed to set logger labels", exc_info=True)
88
+ # NOTE hiding this for now to not print on every request
89
+ # logger.debug("Failed to set logger labels", exc_info=True)
90
+ pass
83
91
 
84
92
 
85
93
  def wrap_app(cls: type[App], **kwargs) -> fal.api.IsolatedFunction:
@@ -173,7 +173,8 @@ def submit(app_id: str, arguments: dict[str, Any], *, path: str = "") -> Request
173
173
  app_id = _backwards_compatible_app_id(app_id)
174
174
  url = _QUEUE_URL_FORMAT.format(app_id=app_id)
175
175
  if path:
176
- url += "/" + path.removeprefix("/")
176
+ _path = path[len("/") :] if path.startswith("/") else path
177
+ url += "/" + _path
177
178
 
178
179
  creds = get_default_credentials()
179
180
 
@@ -235,7 +236,8 @@ def _connect(app_id: str, *, path: str = "/realtime") -> Iterator[_RealtimeConne
235
236
  app_id = _backwards_compatible_app_id(app_id)
236
237
  url = _REALTIME_URL_FORMAT.format(app_id=app_id)
237
238
  if path:
238
- url += "/" + path.removeprefix("/")
239
+ _path = path[len("/") :] if path.startswith("/") else path
240
+ url += "/" + _path
239
241
 
240
242
  creds = get_default_credentials()
241
243
 
@@ -5,7 +5,7 @@ import webbrowser
5
5
  from argparse import ArgumentParser
6
6
  from collections import Counter
7
7
  from dataclasses import dataclass, field
8
- from typing import Any, Iterator, Union, cast
8
+ from typing import Any, Dict, Iterator, List, Union, cast
9
9
 
10
10
  import graphlib
11
11
  import rich
@@ -21,8 +21,8 @@ from fal import flags
21
21
  from fal.exceptions import FalServerlessException
22
22
  from fal.rest_client import REST_CLIENT
23
23
 
24
- JSONType = Union[dict[str, Any], list[Any], str, int, float, bool, None, "Leaf"]
25
- SchemaType = dict[str, Any]
24
+ JSONType = Union[Dict[str, Any], List[Any], str, int, float, bool, None, "Leaf"]
25
+ SchemaType = Dict[str, Any]
26
26
 
27
27
  VARIABLE_PREFIX = "$"
28
28
  INPUT_VARIABLE_NAME = "input"
@@ -50,7 +50,13 @@ def parse_leaf(raw_leaf: str) -> Leaf:
50
50
  f"Invalid leaf: {raw_leaf} (must start with a reference)"
51
51
  )
52
52
 
53
- leaf: Leaf = ReferenceLeaf(reference.removeprefix(VARIABLE_PREFIX))
53
+ # remove the $ prefix
54
+ _reference = (
55
+ reference[len(VARIABLE_PREFIX) :]
56
+ if reference.startswith(VARIABLE_PREFIX)
57
+ else reference
58
+ )
59
+ leaf: Leaf = ReferenceLeaf(_reference)
54
60
  for raw_part in raw_parts:
55
61
  if raw_part.isdigit():
56
62
  leaf = IndexLeaf(leaf, int(raw_part))
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from typing import Optional, Tuple
2
2
  from unittest.mock import MagicMock, patch
3
3
 
4
4
  import pytest
@@ -30,7 +30,7 @@ def mock_parse_pyproject_toml():
30
30
 
31
31
 
32
32
  def mock_args(
33
- app_ref: tuple[str],
33
+ app_ref: Tuple[str, Optional[str]],
34
34
  app_name: Optional[str] = None,
35
35
  auth: Optional[str] = None,
36
36
  strategy: Optional[str] = None,
@@ -1,3 +1,4 @@
1
+ from typing import Optional, Tuple
1
2
  from unittest.mock import MagicMock, patch
2
3
 
3
4
  import pytest
@@ -34,7 +35,7 @@ def mocked_fal_serverless_host(host):
34
35
  return mock
35
36
 
36
37
 
37
- def mock_args(host, func_ref: tuple[str]):
38
+ def mock_args(host, func_ref: Tuple[str, Optional[str]]):
38
39
  args = MagicMock()
39
40
  args.host = host
40
41
  args.func_ref = func_ref
@@ -5,7 +5,7 @@ import subprocess
5
5
  import time
6
6
  from contextlib import contextmanager, suppress
7
7
  from datetime import datetime
8
- from typing import Generator
8
+ from typing import Generator, List, Tuple
9
9
 
10
10
  import fal
11
11
  import fal.api as api
@@ -92,7 +92,7 @@ def container_addition_app(input: Input) -> Output:
92
92
 
93
93
  @fal.function(
94
94
  keep_alive=300,
95
- requirements=["fastapi", "uvicorn", "pydantic==1.10.12"],
95
+ requirements=["fastapi", "uvicorn", "pydantic==1.10.18"],
96
96
  machine_type="S",
97
97
  max_concurrency=1,
98
98
  max_multiplexing=30,
@@ -224,7 +224,7 @@ class RTOutput(BaseModel):
224
224
 
225
225
 
226
226
  class RTOutputs(BaseModel):
227
- texts: list[str]
227
+ texts: List[str]
228
228
 
229
229
 
230
230
  class RealtimeApp(fal.App, keep_alive=300, max_concurrency=1):
@@ -252,7 +252,7 @@ class RealtimeApp(fal.App, keep_alive=300, max_concurrency=1):
252
252
 
253
253
 
254
254
  @pytest.fixture(scope="module")
255
- def aliased_app() -> Generator[tuple[str, str], None, None]:
255
+ def aliased_app() -> Generator[Tuple[str, str], None, None]:
256
256
  # Create a temporary app, register it, and return the ID of it.
257
257
 
258
258
  import uuid
@@ -418,6 +418,7 @@ def test_stateful_app_client(test_stateful_app: str):
418
418
  assert response["result"] == 0
419
419
 
420
420
 
421
+ @pytest.mark.flaky(max_runs=3)
421
422
  def test_app_cancellation(test_app: str, test_cancellable_app: str):
422
423
  request_handle = apps.submit(
423
424
  test_cancellable_app, arguments={"lhs": 1, "rhs": 2, "wait_time": 10}
@@ -516,7 +517,7 @@ def test_404_response(test_app: str, request: pytest.FixtureRequest):
516
517
  apps.run(test_app, path="/other", arguments={"lhs": 1, "rhs": 2})
517
518
 
518
519
 
519
- def test_app_deploy_scale(aliased_app: tuple[str, str]):
520
+ def test_app_deploy_scale(aliased_app: Tuple[str, str]):
520
521
  import uuid
521
522
  from dataclasses import replace
522
523
 
@@ -558,7 +559,7 @@ def test_app_deploy_scale(aliased_app: tuple[str, str]):
558
559
  assert found.max_multiplexing == 30
559
560
 
560
561
 
561
- def test_app_update_app(aliased_app: tuple[str, str]):
562
+ def test_app_update_app(aliased_app: Tuple[str, str]):
562
563
  app_revision, app_alias = aliased_app
563
564
 
564
565
  host: api.FalServerlessHost = addition_app.host # type: ignore
@@ -608,7 +609,7 @@ def test_app_update_app(aliased_app: tuple[str, str]):
608
609
  assert res.max_multiplexing == new_max_multiplexing
609
610
 
610
611
 
611
- def test_app_set_delete_alias(aliased_app: tuple[str, str]):
612
+ def test_app_set_delete_alias(aliased_app: Tuple[str, str]):
612
613
  app_revision, app_alias = aliased_app
613
614
 
614
615
  host: api.FalServerlessHost = addition_app.host # type: ignore
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