fal 1.39.2__tar.gz → 1.40.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 (188) hide show
  1. {fal-1.39.2/fal.egg-info → fal-1.40.1}/PKG-INFO +1 -1
  2. {fal-1.39.2 → fal-1.40.1/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.39.2 → fal-1.40.1}/fal.egg-info/SOURCES.txt +1 -1
  4. {fal-1.39.2 → fal-1.40.1}/src/fal/_fal_version.py +2 -2
  5. {fal-1.39.2 → fal-1.40.1}/src/fal/app.py +1 -1
  6. {fal-1.39.2 → fal-1.40.1}/src/fal/auth/__init__.py +9 -0
  7. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/main.py +2 -0
  8. fal-1.40.1/src/fal/cli/queue.py +101 -0
  9. {fal-1.39.2 → fal-1.40.1}/src/fal/logging/__init__.py +0 -2
  10. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/providers/fal.py +12 -0
  11. fal-1.39.2/src/fal/logging/user.py +0 -25
  12. {fal-1.39.2 → fal-1.40.1}/.gitignore +0 -0
  13. {fal-1.39.2 → fal-1.40.1}/Makefile +0 -0
  14. {fal-1.39.2 → fal-1.40.1}/README.md +0 -0
  15. {fal-1.39.2 → fal-1.40.1}/docs/conf.py +0 -0
  16. {fal-1.39.2 → fal-1.40.1}/docs/index.rst +0 -0
  17. {fal-1.39.2 → fal-1.40.1}/fal.egg-info/dependency_links.txt +0 -0
  18. {fal-1.39.2 → fal-1.40.1}/fal.egg-info/entry_points.txt +0 -0
  19. {fal-1.39.2 → fal-1.40.1}/fal.egg-info/requires.txt +0 -0
  20. {fal-1.39.2 → fal-1.40.1}/fal.egg-info/top_level.txt +0 -0
  21. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/README.md +0 -0
  22. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  23. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  24. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  25. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  26. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  27. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  28. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  29. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  30. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  31. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  32. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  33. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  34. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  35. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  36. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  37. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  38. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  39. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  40. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  41. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  42. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  43. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  44. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  45. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  46. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  47. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  48. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  49. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  50. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  51. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  52. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  53. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  54. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  55. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  56. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  57. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  58. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  59. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  60. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  61. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  62. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  63. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  64. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  65. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  66. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  67. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  68. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  69. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  70. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  71. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  72. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  73. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  74. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  75. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  76. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  77. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  78. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  79. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  80. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  81. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  82. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  83. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  84. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  85. {fal-1.39.2 → fal-1.40.1}/openapi-fal-rest/pyproject.toml +0 -0
  86. {fal-1.39.2 → fal-1.40.1}/openapi_rest.config.yaml +0 -0
  87. {fal-1.39.2 → fal-1.40.1}/pyproject.toml +0 -0
  88. {fal-1.39.2 → fal-1.40.1}/setup.cfg +0 -0
  89. {fal-1.39.2 → fal-1.40.1}/src/fal/__init__.py +0 -0
  90. {fal-1.39.2 → fal-1.40.1}/src/fal/__main__.py +0 -0
  91. {fal-1.39.2 → fal-1.40.1}/src/fal/_serialization.py +0 -0
  92. {fal-1.39.2 → fal-1.40.1}/src/fal/_version.py +0 -0
  93. {fal-1.39.2 → fal-1.40.1}/src/fal/api.py +0 -0
  94. {fal-1.39.2 → fal-1.40.1}/src/fal/apps.py +0 -0
  95. {fal-1.39.2 → fal-1.40.1}/src/fal/auth/auth0.py +0 -0
  96. {fal-1.39.2 → fal-1.40.1}/src/fal/auth/local.py +0 -0
  97. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/__init__.py +0 -0
  98. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/_utils.py +0 -0
  99. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/api.py +0 -0
  100. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/apps.py +0 -0
  101. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/auth.py +0 -0
  102. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/cli_nested_json.py +0 -0
  103. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/create.py +0 -0
  104. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/debug.py +0 -0
  105. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/deploy.py +0 -0
  106. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/doctor.py +0 -0
  107. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/files.py +0 -0
  108. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/keys.py +0 -0
  109. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/parser.py +0 -0
  110. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/profile.py +0 -0
  111. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/run.py +0 -0
  112. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/runners.py +0 -0
  113. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/secrets.py +0 -0
  114. {fal-1.39.2 → fal-1.40.1}/src/fal/cli/teams.py +0 -0
  115. {fal-1.39.2 → fal-1.40.1}/src/fal/config.py +0 -0
  116. {fal-1.39.2 → fal-1.40.1}/src/fal/console/__init__.py +0 -0
  117. {fal-1.39.2 → fal-1.40.1}/src/fal/console/icons.py +0 -0
  118. {fal-1.39.2 → fal-1.40.1}/src/fal/console/ux.py +0 -0
  119. {fal-1.39.2 → fal-1.40.1}/src/fal/container.py +0 -0
  120. {fal-1.39.2 → fal-1.40.1}/src/fal/exceptions/__init__.py +0 -0
  121. {fal-1.39.2 → fal-1.40.1}/src/fal/exceptions/_base.py +0 -0
  122. {fal-1.39.2 → fal-1.40.1}/src/fal/exceptions/_cuda.py +0 -0
  123. {fal-1.39.2 → fal-1.40.1}/src/fal/exceptions/auth.py +0 -0
  124. {fal-1.39.2 → fal-1.40.1}/src/fal/files.py +0 -0
  125. {fal-1.39.2 → fal-1.40.1}/src/fal/flags.py +0 -0
  126. {fal-1.39.2 → fal-1.40.1}/src/fal/logging/isolate.py +0 -0
  127. {fal-1.39.2 → fal-1.40.1}/src/fal/logging/style.py +0 -0
  128. {fal-1.39.2 → fal-1.40.1}/src/fal/logging/trace.py +0 -0
  129. {fal-1.39.2 → fal-1.40.1}/src/fal/project.py +0 -0
  130. {fal-1.39.2 → fal-1.40.1}/src/fal/py.typed +0 -0
  131. {fal-1.39.2 → fal-1.40.1}/src/fal/rest_client.py +0 -0
  132. {fal-1.39.2 → fal-1.40.1}/src/fal/sdk.py +0 -0
  133. {fal-1.39.2 → fal-1.40.1}/src/fal/sync.py +0 -0
  134. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/__init__.py +0 -0
  135. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/audio/__init__.py +0 -0
  136. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/audio/audio.py +0 -0
  137. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/exceptions.py +0 -0
  138. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/__init__.py +0 -0
  139. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/file.py +0 -0
  140. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  141. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  142. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/providers/s3.py +0 -0
  143. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/file/types.py +0 -0
  144. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/__init__.py +0 -0
  145. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/image.py +0 -0
  146. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  147. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  148. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  149. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  150. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  151. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  152. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/kv.py +0 -0
  153. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/optimize.py +0 -0
  154. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/types.py +0 -0
  155. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/utils/__init__.py +0 -0
  156. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/utils/download_utils.py +0 -0
  157. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/utils/endpoint.py +0 -0
  158. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/utils/retry.py +0 -0
  159. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/utils/setup_utils.py +0 -0
  160. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/video/__init__.py +0 -0
  161. {fal-1.39.2 → fal-1.40.1}/src/fal/toolkit/video/video.py +0 -0
  162. {fal-1.39.2 → fal-1.40.1}/src/fal/utils.py +0 -0
  163. {fal-1.39.2 → fal-1.40.1}/src/fal/workflows.py +0 -0
  164. {fal-1.39.2 → fal-1.40.1}/tests/__init__.py +0 -0
  165. {fal-1.39.2 → fal-1.40.1}/tests/assets/cat.png +0 -0
  166. {fal-1.39.2 → fal-1.40.1}/tests/cli/__init__.py +0 -0
  167. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_apps.py +0 -0
  168. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_auth.py +0 -0
  169. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_deploy.py +0 -0
  170. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_keys.py +0 -0
  171. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_run.py +0 -0
  172. {fal-1.39.2 → fal-1.40.1}/tests/cli/test_secrets.py +0 -0
  173. {fal-1.39.2 → fal-1.40.1}/tests/conftest.py +0 -0
  174. {fal-1.39.2 → fal-1.40.1}/tests/integration_test.py +0 -0
  175. {fal-1.39.2 → fal-1.40.1}/tests/mainify_package/__init__.py +0 -0
  176. {fal-1.39.2 → fal-1.40.1}/tests/mainify_package/impl.py +0 -0
  177. {fal-1.39.2 → fal-1.40.1}/tests/mainify_package/utils.py +0 -0
  178. {fal-1.39.2 → fal-1.40.1}/tests/mainify_target.py +0 -0
  179. {fal-1.39.2 → fal-1.40.1}/tests/test_apps.py +0 -0
  180. {fal-1.39.2 → fal-1.40.1}/tests/test_files.py +0 -0
  181. {fal-1.39.2 → fal-1.40.1}/tests/test_kv.py +0 -0
  182. {fal-1.39.2 → fal-1.40.1}/tests/test_stability.py +0 -0
  183. {fal-1.39.2 → fal-1.40.1}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  184. {fal-1.39.2 → fal-1.40.1}/tests/toolkit/file_test.py +0 -0
  185. {fal-1.39.2 → fal-1.40.1}/tests/toolkit/image_test.py +0 -0
  186. {fal-1.39.2 → fal-1.40.1}/tests/toolkit/test_types.py +0 -0
  187. {fal-1.39.2 → fal-1.40.1}/tests/toolkit/utils/retry.py +0 -0
  188. {fal-1.39.2 → fal-1.40.1}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.39.2
3
+ Version: 1.40.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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.39.2
3
+ Version: 1.40.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
@@ -113,6 +113,7 @@ src/fal/cli/keys.py
113
113
  src/fal/cli/main.py
114
114
  src/fal/cli/parser.py
115
115
  src/fal/cli/profile.py
116
+ src/fal/cli/queue.py
116
117
  src/fal/cli/run.py
117
118
  src/fal/cli/runners.py
118
119
  src/fal/cli/secrets.py
@@ -128,7 +129,6 @@ src/fal/logging/__init__.py
128
129
  src/fal/logging/isolate.py
129
130
  src/fal/logging/style.py
130
131
  src/fal/logging/trace.py
131
- src/fal/logging/user.py
132
132
  src/fal/toolkit/__init__.py
133
133
  src/fal/toolkit/exceptions.py
134
134
  src/fal/toolkit/kv.py
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.39.2'
32
- __version_tuple__ = version_tuple = (1, 39, 2)
31
+ __version__ = version = '1.40.1'
32
+ __version_tuple__ = version_tuple = (1, 40, 1)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -300,7 +300,7 @@ def _print_python_packages() -> None:
300
300
  class App(BaseServable):
301
301
  requirements: ClassVar[list[str]] = []
302
302
  local_python_modules: ClassVar[list[str]] = []
303
- machine_type: ClassVar[str] = "S"
303
+ machine_type: ClassVar[str | list[str]] = "S"
304
304
  num_gpus: ClassVar[int | None] = None
305
305
  host_kwargs: ClassVar[dict[str, Any]] = {
306
306
  "_scheduler": "nomad",
@@ -17,6 +17,15 @@ class GoogleColabState:
17
17
  self.lock = Lock()
18
18
  self.secret: Optional[str] = None
19
19
 
20
+ def __getstate__(self):
21
+ state = self.__dict__.copy()
22
+ state["lock"] = None # type: ignore
23
+ return state
24
+
25
+ def __setstate__(self, state):
26
+ self.__dict__.update(state)
27
+ self.lock = Lock()
28
+
20
29
 
21
30
  _colab_state = GoogleColabState()
22
31
 
@@ -16,6 +16,7 @@ from . import (
16
16
  files,
17
17
  keys,
18
18
  profile,
19
+ queue,
19
20
  run,
20
21
  runners,
21
22
  secrets,
@@ -49,6 +50,7 @@ def _get_main_parser() -> argparse.ArgumentParser:
49
50
  api,
50
51
  auth,
51
52
  apps,
53
+ queue,
52
54
  deploy,
53
55
  run,
54
56
  keys,
@@ -0,0 +1,101 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from http import HTTPStatus
5
+
6
+ import httpx
7
+
8
+ from fal.rest_client import REST_CLIENT
9
+
10
+ from .parser import FalClientParser, get_output_parser
11
+
12
+
13
+ def _queue_size(args):
14
+ from .deploy import _get_user
15
+
16
+ user = _get_user()
17
+
18
+ url = f"{REST_CLIENT.base_url}/applications/{user.username}/{args.app_name}/queue"
19
+ headers = REST_CLIENT.get_headers()
20
+
21
+ with httpx.Client(base_url=REST_CLIENT.base_url, headers=headers, timeout=300) as c:
22
+ resp = c.get(url)
23
+
24
+ if resp.status_code != HTTPStatus.OK:
25
+ try:
26
+ detail = resp.json().get("detail", resp.text)
27
+ except Exception:
28
+ detail = resp.text
29
+ raise RuntimeError(f"Failed to get queue size: {detail}")
30
+
31
+ data = resp.json()
32
+ size = data.get("size", 0)
33
+
34
+ if args.output == "json":
35
+ args.console.print(json.dumps({"size": size}))
36
+ else:
37
+ args.console.print(f"Queue size: {size}")
38
+
39
+
40
+ def _queue_flush(args):
41
+ from .deploy import _get_user
42
+
43
+ user = _get_user()
44
+
45
+ url = f"{REST_CLIENT.base_url}/applications/{user.username}/{args.app_name}/queue"
46
+ headers = REST_CLIENT.get_headers()
47
+
48
+ with httpx.Client(base_url=REST_CLIENT.base_url, headers=headers, timeout=300) as c:
49
+ resp = c.delete(url)
50
+
51
+ if resp.status_code != HTTPStatus.OK:
52
+ try:
53
+ detail = resp.json().get("detail", resp.text)
54
+ except Exception:
55
+ detail = resp.text
56
+ raise RuntimeError(f"Failed to flush queue: {detail}")
57
+
58
+ args.console.print("Queue flushed successfully.")
59
+
60
+
61
+ def add_parser(main_subparsers, parents):
62
+ queue_help = "Manage application queues."
63
+ parser = main_subparsers.add_parser(
64
+ "queue",
65
+ description=queue_help,
66
+ help=queue_help,
67
+ parents=parents,
68
+ )
69
+
70
+ subparsers = parser.add_subparsers(
71
+ title="Commands",
72
+ metavar="command",
73
+ required=True,
74
+ parser_class=FalClientParser,
75
+ )
76
+
77
+ size_help = "Get queue size for an application."
78
+ size_parser = subparsers.add_parser(
79
+ "size",
80
+ description=size_help,
81
+ help=size_help,
82
+ parents=[*parents, get_output_parser()],
83
+ )
84
+ size_parser.add_argument(
85
+ "app_name",
86
+ help="Application name (do not prefix with owner).",
87
+ )
88
+ size_parser.set_defaults(func=_queue_size)
89
+
90
+ flush_help = "Flush all pending requests in an application queue."
91
+ flush_parser = subparsers.add_parser(
92
+ "flush",
93
+ description=flush_help,
94
+ help=flush_help,
95
+ parents=parents,
96
+ )
97
+ flush_parser.add_argument(
98
+ "app_name",
99
+ help="Application name.",
100
+ )
101
+ flush_parser.set_defaults(func=_queue_flush)
@@ -6,7 +6,6 @@ import structlog
6
6
  from structlog.typing import EventDict, WrappedLogger
7
7
 
8
8
  from .style import LEVEL_STYLES
9
- from .user import AddUserIdProcessor
10
9
 
11
10
  # Unfortunately structlog console processor does not support
12
11
  # more general theming as a public API. Consider a PR on the
@@ -43,7 +42,6 @@ structlog.configure(
43
42
  structlog.stdlib.PositionalArgumentsFormatter(),
44
43
  structlog.processors.TimeStamper(fmt="%Y-%m-%d %H:%M:%S"),
45
44
  structlog.processors.StackInfoRenderer(),
46
- AddUserIdProcessor(),
47
45
  _console_log_output,
48
46
  ],
49
47
  wrapper_class=structlog.stdlib.BoundLogger,
@@ -159,6 +159,18 @@ class FalV2TokenManager:
159
159
  expires_at=datetime.fromisoformat(result["expires_at"]),
160
160
  )
161
161
 
162
+ def __getstate__(self) -> dict[str, Any]:
163
+ state = self.__dict__.copy()
164
+ # Remove the lock from the state dictionary
165
+ del state["_lock"]
166
+ return state
167
+
168
+ def __setstate__(self, state: dict[str, Any]) -> None:
169
+ # Restore the instance attributes
170
+ self.__dict__.update(state)
171
+ # Recreate the lock
172
+ self._lock = threading.Lock()
173
+
162
174
 
163
175
  class FalV3TokenManager(FalV2TokenManager):
164
176
  token_cls: type[FalV2Token] = FalV3Token
@@ -1,25 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from structlog.typing import EventDict, WrappedLogger
4
-
5
-
6
- class AddUserIdProcessor:
7
- def __init__(self):
8
- from fal.auth import UserAccess
9
-
10
- self.user_access = UserAccess()
11
-
12
- def __call__(
13
- self, logger: WrappedLogger, method_name: str, event_dict: EventDict
14
- ) -> EventDict:
15
- """The structlog processor that sends the logged user id on every log"""
16
- user_id: str | None = None
17
- try:
18
- user_id = self.user_access.info.get("sub")
19
- except Exception:
20
- # logs are fail-safe, so any exception is safe to ignore
21
- # this is expected to happen only when user is logged out
22
- # or there's no internet connection
23
- pass
24
- event_dict["usr.id"] = user_id
25
- return event_dict
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes