fal 1.28.4__tar.gz → 1.29.1__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 (186) hide show
  1. {fal-1.28.4/fal.egg-info → fal-1.29.1}/PKG-INFO +2 -2
  2. {fal-1.28.4 → fal-1.29.1/fal.egg-info}/PKG-INFO +2 -2
  3. {fal-1.28.4 → fal-1.29.1}/fal.egg-info/requires.txt +1 -1
  4. {fal-1.28.4 → fal-1.29.1}/pyproject.toml +1 -1
  5. {fal-1.28.4 → fal-1.29.1}/src/fal/_fal_version.py +2 -2
  6. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/apps.py +6 -1
  7. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/runners.py +8 -2
  8. {fal-1.28.4 → fal-1.29.1}/src/fal/sdk.py +19 -2
  9. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/providers/fal.py +6 -1
  10. {fal-1.28.4 → fal-1.29.1}/tests/test_apps.py +2 -1
  11. {fal-1.28.4 → fal-1.29.1}/.gitignore +0 -0
  12. {fal-1.28.4 → fal-1.29.1}/Makefile +0 -0
  13. {fal-1.28.4 → fal-1.29.1}/README.md +0 -0
  14. {fal-1.28.4 → fal-1.29.1}/docs/conf.py +0 -0
  15. {fal-1.28.4 → fal-1.29.1}/docs/index.rst +0 -0
  16. {fal-1.28.4 → fal-1.29.1}/fal.egg-info/SOURCES.txt +0 -0
  17. {fal-1.28.4 → fal-1.29.1}/fal.egg-info/dependency_links.txt +0 -0
  18. {fal-1.28.4 → fal-1.29.1}/fal.egg-info/entry_points.txt +0 -0
  19. {fal-1.28.4 → fal-1.29.1}/fal.egg-info/top_level.txt +0 -0
  20. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/README.md +0 -0
  21. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  22. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  23. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  24. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  25. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  26. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  27. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  28. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  29. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  30. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  31. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  32. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  33. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  34. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  35. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  36. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  37. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  38. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  39. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  40. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  41. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  42. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  43. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  44. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  45. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  46. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  47. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  48. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  49. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  50. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  51. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  52. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  53. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  54. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  55. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  56. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  57. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  58. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  59. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  60. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  61. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  62. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  63. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  64. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  65. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  66. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  67. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  68. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  69. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  70. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  71. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  72. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  73. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  74. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  75. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  76. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  77. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  78. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  79. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  80. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  81. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  82. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  83. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  84. {fal-1.28.4 → fal-1.29.1}/openapi-fal-rest/pyproject.toml +0 -0
  85. {fal-1.28.4 → fal-1.29.1}/openapi_rest.config.yaml +0 -0
  86. {fal-1.28.4 → fal-1.29.1}/setup.cfg +0 -0
  87. {fal-1.28.4 → fal-1.29.1}/src/fal/__init__.py +0 -0
  88. {fal-1.28.4 → fal-1.29.1}/src/fal/__main__.py +0 -0
  89. {fal-1.28.4 → fal-1.29.1}/src/fal/_serialization.py +0 -0
  90. {fal-1.28.4 → fal-1.29.1}/src/fal/_version.py +0 -0
  91. {fal-1.28.4 → fal-1.29.1}/src/fal/api.py +0 -0
  92. {fal-1.28.4 → fal-1.29.1}/src/fal/app.py +0 -0
  93. {fal-1.28.4 → fal-1.29.1}/src/fal/apps.py +0 -0
  94. {fal-1.28.4 → fal-1.29.1}/src/fal/auth/__init__.py +0 -0
  95. {fal-1.28.4 → fal-1.29.1}/src/fal/auth/auth0.py +0 -0
  96. {fal-1.28.4 → fal-1.29.1}/src/fal/auth/local.py +0 -0
  97. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/__init__.py +0 -0
  98. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/_utils.py +0 -0
  99. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/api.py +0 -0
  100. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/auth.py +0 -0
  101. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/cli_nested_json.py +0 -0
  102. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/create.py +0 -0
  103. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/debug.py +0 -0
  104. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/deploy.py +0 -0
  105. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/doctor.py +0 -0
  106. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/files.py +0 -0
  107. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/keys.py +0 -0
  108. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/main.py +0 -0
  109. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/parser.py +0 -0
  110. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/profile.py +0 -0
  111. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/run.py +0 -0
  112. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/secrets.py +0 -0
  113. {fal-1.28.4 → fal-1.29.1}/src/fal/cli/teams.py +0 -0
  114. {fal-1.28.4 → fal-1.29.1}/src/fal/config.py +0 -0
  115. {fal-1.28.4 → fal-1.29.1}/src/fal/console/__init__.py +0 -0
  116. {fal-1.28.4 → fal-1.29.1}/src/fal/console/icons.py +0 -0
  117. {fal-1.28.4 → fal-1.29.1}/src/fal/console/ux.py +0 -0
  118. {fal-1.28.4 → fal-1.29.1}/src/fal/container.py +0 -0
  119. {fal-1.28.4 → fal-1.29.1}/src/fal/exceptions/__init__.py +0 -0
  120. {fal-1.28.4 → fal-1.29.1}/src/fal/exceptions/_base.py +0 -0
  121. {fal-1.28.4 → fal-1.29.1}/src/fal/exceptions/_cuda.py +0 -0
  122. {fal-1.28.4 → fal-1.29.1}/src/fal/exceptions/auth.py +0 -0
  123. {fal-1.28.4 → fal-1.29.1}/src/fal/files.py +0 -0
  124. {fal-1.28.4 → fal-1.29.1}/src/fal/flags.py +0 -0
  125. {fal-1.28.4 → fal-1.29.1}/src/fal/logging/__init__.py +0 -0
  126. {fal-1.28.4 → fal-1.29.1}/src/fal/logging/isolate.py +0 -0
  127. {fal-1.28.4 → fal-1.29.1}/src/fal/logging/style.py +0 -0
  128. {fal-1.28.4 → fal-1.29.1}/src/fal/logging/trace.py +0 -0
  129. {fal-1.28.4 → fal-1.29.1}/src/fal/logging/user.py +0 -0
  130. {fal-1.28.4 → fal-1.29.1}/src/fal/project.py +0 -0
  131. {fal-1.28.4 → fal-1.29.1}/src/fal/py.typed +0 -0
  132. {fal-1.28.4 → fal-1.29.1}/src/fal/rest_client.py +0 -0
  133. {fal-1.28.4 → fal-1.29.1}/src/fal/sync.py +0 -0
  134. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/__init__.py +0 -0
  135. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/audio/__init__.py +0 -0
  136. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/audio/audio.py +0 -0
  137. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/exceptions.py +0 -0
  138. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/__init__.py +0 -0
  139. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/file.py +0 -0
  140. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  141. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  142. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/providers/s3.py +0 -0
  143. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/file/types.py +0 -0
  144. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/__init__.py +0 -0
  145. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/image.py +0 -0
  146. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  147. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  148. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  149. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  150. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  151. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  152. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/kv.py +0 -0
  153. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/optimize.py +0 -0
  154. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/types.py +0 -0
  155. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/utils/__init__.py +0 -0
  156. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/utils/download_utils.py +0 -0
  157. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/utils/endpoint.py +0 -0
  158. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/utils/retry.py +0 -0
  159. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/video/__init__.py +0 -0
  160. {fal-1.28.4 → fal-1.29.1}/src/fal/toolkit/video/video.py +0 -0
  161. {fal-1.28.4 → fal-1.29.1}/src/fal/utils.py +0 -0
  162. {fal-1.28.4 → fal-1.29.1}/src/fal/workflows.py +0 -0
  163. {fal-1.28.4 → fal-1.29.1}/tests/__init__.py +0 -0
  164. {fal-1.28.4 → fal-1.29.1}/tests/assets/cat.png +0 -0
  165. {fal-1.28.4 → fal-1.29.1}/tests/cli/__init__.py +0 -0
  166. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_apps.py +0 -0
  167. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_auth.py +0 -0
  168. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_deploy.py +0 -0
  169. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_keys.py +0 -0
  170. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_run.py +0 -0
  171. {fal-1.28.4 → fal-1.29.1}/tests/cli/test_secrets.py +0 -0
  172. {fal-1.28.4 → fal-1.29.1}/tests/conftest.py +0 -0
  173. {fal-1.28.4 → fal-1.29.1}/tests/integration_test.py +0 -0
  174. {fal-1.28.4 → fal-1.29.1}/tests/mainify_package/__init__.py +0 -0
  175. {fal-1.28.4 → fal-1.29.1}/tests/mainify_package/impl.py +0 -0
  176. {fal-1.28.4 → fal-1.29.1}/tests/mainify_package/utils.py +0 -0
  177. {fal-1.28.4 → fal-1.29.1}/tests/mainify_target.py +0 -0
  178. {fal-1.28.4 → fal-1.29.1}/tests/test_files.py +0 -0
  179. {fal-1.28.4 → fal-1.29.1}/tests/test_kv.py +0 -0
  180. {fal-1.28.4 → fal-1.29.1}/tests/test_stability.py +0 -0
  181. {fal-1.28.4 → fal-1.29.1}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  182. {fal-1.28.4 → fal-1.29.1}/tests/toolkit/file_test.py +0 -0
  183. {fal-1.28.4 → fal-1.29.1}/tests/toolkit/image_test.py +0 -0
  184. {fal-1.28.4 → fal-1.29.1}/tests/toolkit/test_types.py +0 -0
  185. {fal-1.28.4 → fal-1.29.1}/tests/toolkit/utils/retry.py +0 -0
  186. {fal-1.28.4 → fal-1.29.1}/tools/demo_script.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.28.4
3
+ Version: 1.29.1
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.19.0,>=0.18.0
9
- Requires-Dist: isolate-proto<0.11.0,>=0.10.2
9
+ Requires-Dist: isolate-proto<0.12.0,>=0.11.0
10
10
  Requires-Dist: grpcio<2,>=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.4
2
2
  Name: fal
3
- Version: 1.28.4
3
+ Version: 1.29.1
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.19.0,>=0.18.0
9
- Requires-Dist: isolate-proto<0.11.0,>=0.10.2
9
+ Requires-Dist: isolate-proto<0.12.0,>=0.11.0
10
10
  Requires-Dist: grpcio<2,>=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.19.0,>=0.18.0
2
- isolate-proto<0.11.0,>=0.10.2
2
+ isolate-proto<0.12.0,>=0.11.0
3
3
  grpcio<2,>=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.18.0,<0.19.0",
26
- "isolate-proto>=0.10.2,<0.11.0",
26
+ "isolate-proto>=0.11.0,<0.12.0",
27
27
  "grpcio>=1.64.0,<2",
28
28
  "dill==0.3.7",
29
29
  "cloudpickle==3.0.0",
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.28.4'
21
- __version_tuple__ = version_tuple = (1, 28, 4)
20
+ __version__ = version = '1.29.1'
21
+ __version_tuple__ = version_tuple = (1, 29, 1)
@@ -5,6 +5,7 @@ from dataclasses import asdict
5
5
  from typing import TYPE_CHECKING
6
6
 
7
7
  import fal.cli.runners as runners
8
+ from fal.sdk import RunnerState
8
9
 
9
10
  from ._utils import get_client
10
11
  from .parser import FalClientParser
@@ -298,7 +299,11 @@ def _runners(args):
298
299
  alias_runners = connection.list_alias_runners(alias=args.app_name)
299
300
 
300
301
  runners_table = runners.runners_table(alias_runners)
301
- args.console.print(f"Runners: {len(alias_runners)}")
302
+ pending_runners = [
303
+ runner for runner in alias_runners if runner.state == RunnerState.PENDING
304
+ ]
305
+ args.console.print(f"Runners: {len(alias_runners) - len(pending_runners)}")
306
+ args.console.print(f"Pending Runners: {len(pending_runners)}")
302
307
  # Drop the alias column, which is the first column
303
308
  runners_table.columns.pop(0)
304
309
  args.console.print(runners_table)
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import List
4
4
 
5
- from fal.sdk import RunnerInfo
5
+ from fal.sdk import RunnerInfo, RunnerState
6
6
 
7
7
  from ._utils import get_client
8
8
  from .parser import FalClientParser
@@ -19,6 +19,7 @@ def runners_table(runners: List[RunnerInfo]):
19
19
  table.add_column("Expires In")
20
20
  table.add_column("Uptime")
21
21
  table.add_column("Revision")
22
+ table.add_column("State")
22
23
 
23
24
  for runner in runners:
24
25
  external_metadata = runner.external_metadata
@@ -45,6 +46,7 @@ def runners_table(runners: List[RunnerInfo]):
45
46
  ),
46
47
  f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
47
48
  runner.revision,
49
+ runner.state.value,
48
50
  )
49
51
 
50
52
  return table
@@ -82,7 +84,11 @@ def _list(args):
82
84
  client = get_client(args.host, args.team)
83
85
  with client.connect() as connection:
84
86
  runners = connection.list_runners()
85
- args.console.print(f"Runners: {len(runners)}")
87
+ pending_runners = [
88
+ runner for runner in runners if runner.state == RunnerState.PENDING
89
+ ]
90
+ args.console.print(f"Runners: {len(runners) - len(pending_runners)}")
91
+ args.console.print(f"Pending Runners: {len(pending_runners)}")
86
92
  args.console.print(runners_table(runners))
87
93
 
88
94
  requests_table = runners_requests_table(runners)
@@ -261,6 +261,21 @@ class AliasInfo:
261
261
  valid_regions: list[str]
262
262
 
263
263
 
264
+ class RunnerState(Enum):
265
+ RUNNING = "running"
266
+ PENDING = "pending"
267
+ UNKNOWN = "unknown"
268
+
269
+ @staticmethod
270
+ def from_proto(proto: isolate_proto.RunnerInfo.State) -> RunnerState:
271
+ if proto is isolate_proto.RunnerInfo.State.RUNNING:
272
+ return RunnerState.RUNNING
273
+ elif proto is isolate_proto.RunnerInfo.State.PENDING:
274
+ return RunnerState.PENDING
275
+ else:
276
+ return RunnerState.UNKNOWN
277
+
278
+
264
279
  @dataclass
265
280
  class RunnerInfo:
266
281
  runner_id: str
@@ -270,6 +285,7 @@ class RunnerInfo:
270
285
  external_metadata: dict[str, Any]
271
286
  revision: str
272
287
  alias: str
288
+ state: RunnerState
273
289
 
274
290
 
275
291
  @dataclass
@@ -421,6 +437,7 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
421
437
  external_metadata=external_metadata,
422
438
  revision=message.revision,
423
439
  alias=message.alias,
440
+ state=RunnerState.from_proto(message.state),
424
441
  )
425
442
 
426
443
 
@@ -769,7 +786,7 @@ class FalServerlessConnection:
769
786
  return [from_grpc(alias) for alias in response.aliases]
770
787
 
771
788
  def list_alias_runners(self, alias: str) -> list[RunnerInfo]:
772
- request = isolate_proto.ListAliasRunnersRequest(alias=alias)
789
+ request = isolate_proto.ListAliasRunnersRequest(alias=alias, list_pending=True)
773
790
  response = self.stub.ListAliasRunners(request)
774
791
  return [from_grpc(runner) for runner in response.runners]
775
792
 
@@ -797,6 +814,6 @@ class FalServerlessConnection:
797
814
  self.stub.KillRunner(request)
798
815
 
799
816
  def list_runners(self) -> list[RunnerInfo]:
800
- request = isolate_proto.ListRunnersRequest()
817
+ request = isolate_proto.ListRunnersRequest(list_pending=True)
801
818
  response = self.stub.ListRunners(request)
802
819
  return [from_grpc(runner) for runner in response.runners]
@@ -10,7 +10,7 @@ from dataclasses import dataclass
10
10
  from datetime import datetime, timezone
11
11
  from pathlib import Path
12
12
  from typing import Any, Dict, Generator, Generic, TypeVar
13
- from urllib.error import HTTPError
13
+ from urllib.error import HTTPError, URLError
14
14
  from urllib.parse import urlparse, urlunparse
15
15
  from urllib.request import Request, urlopen
16
16
  from urllib.response import addinfourl
@@ -44,6 +44,11 @@ def _urlopen(
44
44
  def _should_retry(exc: Exception) -> bool:
45
45
  if isinstance(exc, HTTPError) and exc.code in RETRY_CODES:
46
46
  return True
47
+ elif type(exc) is URLError:
48
+ # URLError is a base class for other errors,
49
+ # but it can be raised directly, e.g.
50
+ # URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
51
+ return True
47
52
 
48
53
  if isinstance(exc, TimeoutError):
49
54
  return True
@@ -1015,7 +1015,8 @@ def test_kill_runner(host: api.FalServerlessHost, test_sleep_app: str):
1015
1015
  client.kill_runner(runners[0].runner_id)
1016
1016
 
1017
1017
  runners = client.list_alias_runners(app_alias)
1018
- assert len(runners) == 0
1018
+ num_runners = len([runner for runner in runners if runner.state == "running"])
1019
+ assert num_runners == 0
1019
1020
 
1020
1021
 
1021
1022
  def test_container_app_client(test_container_app: str):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes