fal 1.20.0__tar.gz → 1.20.2__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 (183) hide show
  1. {fal-1.20.0/fal.egg-info → fal-1.20.2}/PKG-INFO +1 -1
  2. {fal-1.20.0 → fal-1.20.2/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.20.0 → fal-1.20.2}/src/fal/_fal_version.py +2 -2
  4. {fal-1.20.0 → fal-1.20.2}/src/fal/api.py +3 -0
  5. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/files.py +30 -4
  6. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/__init__.py +10 -6
  7. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/audio/audio.py +12 -0
  8. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/file.py +9 -0
  9. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/image.py +9 -0
  10. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/video/video.py +12 -0
  11. {fal-1.20.0 → fal-1.20.2}/.gitignore +0 -0
  12. {fal-1.20.0 → fal-1.20.2}/Makefile +0 -0
  13. {fal-1.20.0 → fal-1.20.2}/README.md +0 -0
  14. {fal-1.20.0 → fal-1.20.2}/docs/conf.py +0 -0
  15. {fal-1.20.0 → fal-1.20.2}/docs/index.rst +0 -0
  16. {fal-1.20.0 → fal-1.20.2}/fal.egg-info/SOURCES.txt +0 -0
  17. {fal-1.20.0 → fal-1.20.2}/fal.egg-info/dependency_links.txt +0 -0
  18. {fal-1.20.0 → fal-1.20.2}/fal.egg-info/entry_points.txt +0 -0
  19. {fal-1.20.0 → fal-1.20.2}/fal.egg-info/requires.txt +0 -0
  20. {fal-1.20.0 → fal-1.20.2}/fal.egg-info/top_level.txt +0 -0
  21. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/README.md +0 -0
  22. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  23. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  24. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  25. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  26. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  27. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  28. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  29. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  30. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  31. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  32. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  33. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  34. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  35. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  36. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  37. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  38. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  39. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  40. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  41. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  42. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  43. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  44. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  45. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  46. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  47. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  48. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  49. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  50. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  51. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  52. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  53. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  54. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  55. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  56. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  57. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  58. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  59. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  60. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  61. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  62. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  63. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  64. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  65. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  66. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  67. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  68. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  69. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  70. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  71. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  72. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  73. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  74. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  75. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  76. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  77. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  78. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  79. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  80. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  81. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  82. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  83. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  84. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  85. {fal-1.20.0 → fal-1.20.2}/openapi-fal-rest/pyproject.toml +0 -0
  86. {fal-1.20.0 → fal-1.20.2}/openapi_rest.config.yaml +0 -0
  87. {fal-1.20.0 → fal-1.20.2}/pyproject.toml +0 -0
  88. {fal-1.20.0 → fal-1.20.2}/setup.cfg +0 -0
  89. {fal-1.20.0 → fal-1.20.2}/src/fal/__init__.py +0 -0
  90. {fal-1.20.0 → fal-1.20.2}/src/fal/__main__.py +0 -0
  91. {fal-1.20.0 → fal-1.20.2}/src/fal/_serialization.py +0 -0
  92. {fal-1.20.0 → fal-1.20.2}/src/fal/_version.py +0 -0
  93. {fal-1.20.0 → fal-1.20.2}/src/fal/app.py +0 -0
  94. {fal-1.20.0 → fal-1.20.2}/src/fal/apps.py +0 -0
  95. {fal-1.20.0 → fal-1.20.2}/src/fal/auth/__init__.py +0 -0
  96. {fal-1.20.0 → fal-1.20.2}/src/fal/auth/auth0.py +0 -0
  97. {fal-1.20.0 → fal-1.20.2}/src/fal/auth/local.py +0 -0
  98. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/__init__.py +0 -0
  99. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/_utils.py +0 -0
  100. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/api.py +0 -0
  101. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/apps.py +0 -0
  102. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/auth.py +0 -0
  103. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/cli_nested_json.py +0 -0
  104. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/create.py +0 -0
  105. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/debug.py +0 -0
  106. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/deploy.py +0 -0
  107. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/doctor.py +0 -0
  108. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/keys.py +0 -0
  109. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/main.py +0 -0
  110. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/parser.py +0 -0
  111. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/profile.py +0 -0
  112. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/run.py +0 -0
  113. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/runners.py +0 -0
  114. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/secrets.py +0 -0
  115. {fal-1.20.0 → fal-1.20.2}/src/fal/cli/teams.py +0 -0
  116. {fal-1.20.0 → fal-1.20.2}/src/fal/config.py +0 -0
  117. {fal-1.20.0 → fal-1.20.2}/src/fal/console/__init__.py +0 -0
  118. {fal-1.20.0 → fal-1.20.2}/src/fal/console/icons.py +0 -0
  119. {fal-1.20.0 → fal-1.20.2}/src/fal/console/ux.py +0 -0
  120. {fal-1.20.0 → fal-1.20.2}/src/fal/container.py +0 -0
  121. {fal-1.20.0 → fal-1.20.2}/src/fal/exceptions/__init__.py +0 -0
  122. {fal-1.20.0 → fal-1.20.2}/src/fal/exceptions/_base.py +0 -0
  123. {fal-1.20.0 → fal-1.20.2}/src/fal/exceptions/_cuda.py +0 -0
  124. {fal-1.20.0 → fal-1.20.2}/src/fal/exceptions/auth.py +0 -0
  125. {fal-1.20.0 → fal-1.20.2}/src/fal/files.py +0 -0
  126. {fal-1.20.0 → fal-1.20.2}/src/fal/flags.py +0 -0
  127. {fal-1.20.0 → fal-1.20.2}/src/fal/logging/__init__.py +0 -0
  128. {fal-1.20.0 → fal-1.20.2}/src/fal/logging/isolate.py +0 -0
  129. {fal-1.20.0 → fal-1.20.2}/src/fal/logging/style.py +0 -0
  130. {fal-1.20.0 → fal-1.20.2}/src/fal/logging/trace.py +0 -0
  131. {fal-1.20.0 → fal-1.20.2}/src/fal/logging/user.py +0 -0
  132. {fal-1.20.0 → fal-1.20.2}/src/fal/project.py +0 -0
  133. {fal-1.20.0 → fal-1.20.2}/src/fal/py.typed +0 -0
  134. {fal-1.20.0 → fal-1.20.2}/src/fal/rest_client.py +0 -0
  135. {fal-1.20.0 → fal-1.20.2}/src/fal/sdk.py +0 -0
  136. {fal-1.20.0 → fal-1.20.2}/src/fal/sync.py +0 -0
  137. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/audio/__init__.py +0 -0
  138. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/exceptions.py +0 -0
  139. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/__init__.py +0 -0
  140. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/providers/fal.py +0 -0
  141. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/providers/gcp.py +0 -0
  142. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/providers/r2.py +0 -0
  143. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/providers/s3.py +0 -0
  144. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/file/types.py +0 -0
  145. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/__init__.py +0 -0
  146. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  147. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  148. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  149. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  150. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  151. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/image/safety_checker.py +0 -0
  152. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/optimize.py +0 -0
  153. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/types.py +0 -0
  154. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/utils/__init__.py +0 -0
  155. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/utils/download_utils.py +0 -0
  156. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/utils/endpoint.py +0 -0
  157. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/utils/retry.py +0 -0
  158. {fal-1.20.0 → fal-1.20.2}/src/fal/toolkit/video/__init__.py +0 -0
  159. {fal-1.20.0 → fal-1.20.2}/src/fal/utils.py +0 -0
  160. {fal-1.20.0 → fal-1.20.2}/src/fal/workflows.py +0 -0
  161. {fal-1.20.0 → fal-1.20.2}/tests/__init__.py +0 -0
  162. {fal-1.20.0 → fal-1.20.2}/tests/assets/cat.png +0 -0
  163. {fal-1.20.0 → fal-1.20.2}/tests/cli/__init__.py +0 -0
  164. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_apps.py +0 -0
  165. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_auth.py +0 -0
  166. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_deploy.py +0 -0
  167. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_keys.py +0 -0
  168. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_run.py +0 -0
  169. {fal-1.20.0 → fal-1.20.2}/tests/cli/test_secrets.py +0 -0
  170. {fal-1.20.0 → fal-1.20.2}/tests/conftest.py +0 -0
  171. {fal-1.20.0 → fal-1.20.2}/tests/integration_test.py +0 -0
  172. {fal-1.20.0 → fal-1.20.2}/tests/mainify_package/__init__.py +0 -0
  173. {fal-1.20.0 → fal-1.20.2}/tests/mainify_package/impl.py +0 -0
  174. {fal-1.20.0 → fal-1.20.2}/tests/mainify_package/utils.py +0 -0
  175. {fal-1.20.0 → fal-1.20.2}/tests/mainify_target.py +0 -0
  176. {fal-1.20.0 → fal-1.20.2}/tests/test_apps.py +0 -0
  177. {fal-1.20.0 → fal-1.20.2}/tests/test_stability.py +0 -0
  178. {fal-1.20.0 → fal-1.20.2}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  179. {fal-1.20.0 → fal-1.20.2}/tests/toolkit/file_test.py +0 -0
  180. {fal-1.20.0 → fal-1.20.2}/tests/toolkit/image_test.py +0 -0
  181. {fal-1.20.0 → fal-1.20.2}/tests/toolkit/test_types.py +0 -0
  182. {fal-1.20.0 → fal-1.20.2}/tests/toolkit/utils/retry.py +0 -0
  183. {fal-1.20.0 → fal-1.20.2}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.20.0
3
+ Version: 1.20.2
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.20.0
3
+ Version: 1.20.2
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.20.0'
21
- __version_tuple__ = version_tuple = (1, 20, 0)
20
+ __version__ = version = '1.20.2'
21
+ __version_tuple__ = version_tuple = (1, 20, 2)
@@ -1183,6 +1183,9 @@ class BaseServable:
1183
1183
  app_info.labels(version=self.version).set(1)
1184
1184
 
1185
1185
  app = self._build_app()
1186
+
1187
+ # We use the default workers=1 config because setup function can be heavy
1188
+ # and it runs once per worker.
1186
1189
  server = Server(
1187
1190
  config=Config(app, host="0.0.0.0", port=8080, timeout_keep_alive=300)
1188
1191
  )
@@ -48,11 +48,19 @@ def add_parser(main_subparsers, parents):
48
48
  subparsers = parser.add_subparsers(
49
49
  title="Commands",
50
50
  metavar="command",
51
+ dest="cmd",
51
52
  required=True,
52
53
  parser_class=FalClientParser,
53
54
  )
54
55
 
55
- list_parser = subparsers.add_parser("list", aliases=["ls"], parents=parents)
56
+ list_help = "List files."
57
+ list_parser = subparsers.add_parser(
58
+ "list",
59
+ aliases=["ls"],
60
+ description=list_help,
61
+ help=list_help,
62
+ parents=parents,
63
+ )
56
64
  list_parser.add_argument(
57
65
  "path",
58
66
  nargs="?",
@@ -62,7 +70,13 @@ def add_parser(main_subparsers, parents):
62
70
  )
63
71
  list_parser.set_defaults(func=_list)
64
72
 
65
- download_parser = subparsers.add_parser("download", parents=parents)
73
+ download_help = "Download files."
74
+ download_parser = subparsers.add_parser(
75
+ "download",
76
+ description=download_help,
77
+ help=download_help,
78
+ parents=parents,
79
+ )
66
80
  download_parser.add_argument(
67
81
  "remote_path", type=str, help="Remote path to download"
68
82
  )
@@ -71,12 +85,24 @@ def add_parser(main_subparsers, parents):
71
85
  )
72
86
  download_parser.set_defaults(func=_download)
73
87
 
74
- upload_parser = subparsers.add_parser("upload", parents=parents)
88
+ upload_help = "Upload files."
89
+ upload_parser = subparsers.add_parser(
90
+ "upload",
91
+ description=upload_help,
92
+ help=upload_help,
93
+ parents=parents,
94
+ )
75
95
  upload_parser.add_argument("local_path", type=str, help="Local path to upload")
76
96
  upload_parser.add_argument("remote_path", type=str, help="Remote path to upload to")
77
97
  upload_parser.set_defaults(func=_upload)
78
98
 
79
- upload_url_parser = subparsers.add_parser("upload-url", parents=parents)
99
+ upload_url_help = "Upload file from URL."
100
+ upload_url_parser = subparsers.add_parser(
101
+ "upload-url",
102
+ description=upload_url_help,
103
+ help=upload_url_help,
104
+ parents=parents,
105
+ )
80
106
  upload_url_parser.add_argument("url", type=str, help="URL to upload")
81
107
  upload_url_parser.add_argument(
82
108
  "remote_path", type=str, help="Remote path to upload to"
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from fal.toolkit.audio.audio import Audio
4
- from fal.toolkit.file import CompressedFile, File
5
- from fal.toolkit.image.image import Image, ImageSizeInput, get_image_size
3
+ from fal.toolkit.audio.audio import Audio, AudioField
4
+ from fal.toolkit.file import CompressedFile, File, FileField
5
+ from fal.toolkit.image.image import Image, ImageField, ImageSizeInput, get_image_size
6
6
  from fal.toolkit.optimize import optimize
7
7
  from fal.toolkit.utils import (
8
8
  FAL_MODEL_WEIGHTS_DIR,
@@ -12,17 +12,21 @@ from fal.toolkit.utils import (
12
12
  download_file,
13
13
  download_model_weights,
14
14
  )
15
- from fal.toolkit.video.video import Video
15
+ from fal.toolkit.video.video import Video, VideoField
16
16
 
17
17
  __all__ = [
18
+ "Audio",
19
+ "AudioField",
18
20
  "CompressedFile",
19
21
  "File",
22
+ "FileField",
20
23
  "Image",
24
+ "ImageField",
21
25
  "ImageSizeInput",
22
26
  "get_image_size",
23
- "Audio",
24
- "Video",
25
27
  "optimize",
28
+ "Video",
29
+ "VideoField",
26
30
  "FAL_MODEL_WEIGHTS_DIR",
27
31
  "FAL_PERSISTENT_DIR",
28
32
  "FAL_REPOSITORY_DIR",
@@ -1,6 +1,18 @@
1
+ from functools import wraps
2
+
3
+ from pydantic import Field
4
+
1
5
  from fal.toolkit.file.file import IS_PYDANTIC_V2, File
2
6
 
3
7
 
8
+ @wraps(Field)
9
+ def AudioField(*args, **kwargs):
10
+ ui = kwargs.get("ui", {})
11
+ ui.setdefault("field", "audio")
12
+ kwargs["ui"] = ui
13
+ return Field(*args, **kwargs)
14
+
15
+
4
16
  class Audio(File):
5
17
  if IS_PYDANTIC_V2:
6
18
  model_config = {"json_schema_extra": {"ui": {"field": "audio"}}}
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import shutil
4
+ from functools import wraps
4
5
  from pathlib import Path
5
6
  from tempfile import NamedTemporaryFile, mkdtemp
6
7
  from typing import Any, Callable, Optional
@@ -63,6 +64,14 @@ FALLBACK_REPOSITORY: FileRepository | RepositoryId = "fal"
63
64
  OBJECT_LIFECYCLE_PREFERENCE_KEY = "x-fal-object-lifecycle-preference"
64
65
 
65
66
 
67
+ @wraps(Field)
68
+ def FileField(*args, **kwargs):
69
+ ui = kwargs.get("ui", {})
70
+ ui.setdefault("field", "file")
71
+ kwargs["ui"] = ui
72
+ return Field(*args, **kwargs)
73
+
74
+
66
75
  class File(BaseModel):
67
76
  # public properties
68
77
  url: str = Field(
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import io
4
+ from functools import wraps
4
5
  from tempfile import NamedTemporaryFile
5
6
  from typing import TYPE_CHECKING, Literal, Optional, Union
6
7
 
@@ -63,6 +64,14 @@ def get_image_size(source: ImageSizeInput) -> ImageSize:
63
64
  ImageFormat = Literal["png", "jpeg", "jpg", "webp", "gif"]
64
65
 
65
66
 
67
+ @wraps(Field)
68
+ def ImageField(*args, **kwargs):
69
+ ui = kwargs.get("ui", {})
70
+ ui.setdefault("field", "image")
71
+ kwargs["ui"] = ui
72
+ return Field(*args, **kwargs)
73
+
74
+
66
75
  class Image(File):
67
76
  """
68
77
  Represents an image file.
@@ -1,6 +1,18 @@
1
+ from functools import wraps
2
+
3
+ from pydantic import Field
4
+
1
5
  from fal.toolkit.file.file import IS_PYDANTIC_V2, File
2
6
 
3
7
 
8
+ @wraps(Field)
9
+ def VideoField(*args, **kwargs):
10
+ ui = kwargs.get("ui", {})
11
+ ui.setdefault("field", "video")
12
+ kwargs["ui"] = ui
13
+ return Field(*args, **kwargs)
14
+
15
+
4
16
  class Video(File):
5
17
  if IS_PYDANTIC_V2:
6
18
  model_config = {"json_schema_extra": {"ui": {"field": "video"}}}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes