fal 1.26.6__tar.gz → 1.27.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.26.6/fal.egg-info → fal-1.27.1}/PKG-INFO +1 -1
  2. {fal-1.26.6 → fal-1.27.1/fal.egg-info}/PKG-INFO +1 -1
  3. {fal-1.26.6 → fal-1.27.1}/src/fal/_fal_version.py +2 -2
  4. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/file.py +1 -1
  5. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/image.py +2 -2
  6. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/utils/download_utils.py +26 -2
  7. {fal-1.26.6 → fal-1.27.1}/.gitignore +0 -0
  8. {fal-1.26.6 → fal-1.27.1}/Makefile +0 -0
  9. {fal-1.26.6 → fal-1.27.1}/README.md +0 -0
  10. {fal-1.26.6 → fal-1.27.1}/docs/conf.py +0 -0
  11. {fal-1.26.6 → fal-1.27.1}/docs/index.rst +0 -0
  12. {fal-1.26.6 → fal-1.27.1}/fal.egg-info/SOURCES.txt +0 -0
  13. {fal-1.26.6 → fal-1.27.1}/fal.egg-info/dependency_links.txt +0 -0
  14. {fal-1.26.6 → fal-1.27.1}/fal.egg-info/entry_points.txt +0 -0
  15. {fal-1.26.6 → fal-1.27.1}/fal.egg-info/requires.txt +0 -0
  16. {fal-1.26.6 → fal-1.27.1}/fal.egg-info/top_level.txt +0 -0
  17. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/README.md +0 -0
  18. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
  19. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
  20. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
  21. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
  22. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
  23. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
  24. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
  25. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
  26. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
  27. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
  28. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
  29. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
  30. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
  31. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
  32. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
  33. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
  34. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
  35. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
  36. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
  37. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
  38. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
  39. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
  40. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
  41. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
  42. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
  43. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
  44. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
  45. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
  46. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
  47. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
  48. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
  49. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
  50. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
  51. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
  52. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
  53. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
  54. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
  55. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
  56. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
  57. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
  58. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
  59. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
  60. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
  61. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
  62. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
  63. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
  64. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
  65. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
  66. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
  67. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
  68. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
  69. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
  70. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
  71. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
  72. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
  73. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
  74. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
  75. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
  76. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
  77. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
  78. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
  79. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
  80. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
  81. {fal-1.26.6 → fal-1.27.1}/openapi-fal-rest/pyproject.toml +0 -0
  82. {fal-1.26.6 → fal-1.27.1}/openapi_rest.config.yaml +0 -0
  83. {fal-1.26.6 → fal-1.27.1}/pyproject.toml +0 -0
  84. {fal-1.26.6 → fal-1.27.1}/setup.cfg +0 -0
  85. {fal-1.26.6 → fal-1.27.1}/src/fal/__init__.py +0 -0
  86. {fal-1.26.6 → fal-1.27.1}/src/fal/__main__.py +0 -0
  87. {fal-1.26.6 → fal-1.27.1}/src/fal/_serialization.py +0 -0
  88. {fal-1.26.6 → fal-1.27.1}/src/fal/_version.py +0 -0
  89. {fal-1.26.6 → fal-1.27.1}/src/fal/api.py +0 -0
  90. {fal-1.26.6 → fal-1.27.1}/src/fal/app.py +0 -0
  91. {fal-1.26.6 → fal-1.27.1}/src/fal/apps.py +0 -0
  92. {fal-1.26.6 → fal-1.27.1}/src/fal/auth/__init__.py +0 -0
  93. {fal-1.26.6 → fal-1.27.1}/src/fal/auth/auth0.py +0 -0
  94. {fal-1.26.6 → fal-1.27.1}/src/fal/auth/local.py +0 -0
  95. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/__init__.py +0 -0
  96. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/_utils.py +0 -0
  97. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/api.py +0 -0
  98. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/apps.py +0 -0
  99. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/auth.py +0 -0
  100. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/cli_nested_json.py +0 -0
  101. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/create.py +0 -0
  102. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/debug.py +0 -0
  103. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/deploy.py +0 -0
  104. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/doctor.py +0 -0
  105. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/files.py +0 -0
  106. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/keys.py +0 -0
  107. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/main.py +0 -0
  108. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/parser.py +0 -0
  109. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/profile.py +0 -0
  110. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/run.py +0 -0
  111. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/runners.py +0 -0
  112. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/secrets.py +0 -0
  113. {fal-1.26.6 → fal-1.27.1}/src/fal/cli/teams.py +0 -0
  114. {fal-1.26.6 → fal-1.27.1}/src/fal/config.py +0 -0
  115. {fal-1.26.6 → fal-1.27.1}/src/fal/console/__init__.py +0 -0
  116. {fal-1.26.6 → fal-1.27.1}/src/fal/console/icons.py +0 -0
  117. {fal-1.26.6 → fal-1.27.1}/src/fal/console/ux.py +0 -0
  118. {fal-1.26.6 → fal-1.27.1}/src/fal/container.py +0 -0
  119. {fal-1.26.6 → fal-1.27.1}/src/fal/exceptions/__init__.py +0 -0
  120. {fal-1.26.6 → fal-1.27.1}/src/fal/exceptions/_base.py +0 -0
  121. {fal-1.26.6 → fal-1.27.1}/src/fal/exceptions/_cuda.py +0 -0
  122. {fal-1.26.6 → fal-1.27.1}/src/fal/exceptions/auth.py +0 -0
  123. {fal-1.26.6 → fal-1.27.1}/src/fal/files.py +0 -0
  124. {fal-1.26.6 → fal-1.27.1}/src/fal/flags.py +0 -0
  125. {fal-1.26.6 → fal-1.27.1}/src/fal/logging/__init__.py +0 -0
  126. {fal-1.26.6 → fal-1.27.1}/src/fal/logging/isolate.py +0 -0
  127. {fal-1.26.6 → fal-1.27.1}/src/fal/logging/style.py +0 -0
  128. {fal-1.26.6 → fal-1.27.1}/src/fal/logging/trace.py +0 -0
  129. {fal-1.26.6 → fal-1.27.1}/src/fal/logging/user.py +0 -0
  130. {fal-1.26.6 → fal-1.27.1}/src/fal/project.py +0 -0
  131. {fal-1.26.6 → fal-1.27.1}/src/fal/py.typed +0 -0
  132. {fal-1.26.6 → fal-1.27.1}/src/fal/rest_client.py +0 -0
  133. {fal-1.26.6 → fal-1.27.1}/src/fal/sdk.py +0 -0
  134. {fal-1.26.6 → fal-1.27.1}/src/fal/sync.py +0 -0
  135. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/__init__.py +0 -0
  136. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/audio/__init__.py +0 -0
  137. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/audio/audio.py +0 -0
  138. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/exceptions.py +0 -0
  139. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/__init__.py +0 -0
  140. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/providers/fal.py +0 -0
  141. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/providers/gcp.py +0 -0
  142. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/providers/r2.py +0 -0
  143. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/providers/s3.py +0 -0
  144. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/file/types.py +0 -0
  145. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/__init__.py +0 -0
  146. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
  147. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
  148. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
  149. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
  150. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
  151. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/image/safety_checker.py +0 -0
  152. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/kv.py +0 -0
  153. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/optimize.py +0 -0
  154. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/types.py +0 -0
  155. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/utils/__init__.py +0 -0
  156. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/utils/endpoint.py +0 -0
  157. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/utils/retry.py +0 -0
  158. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/video/__init__.py +0 -0
  159. {fal-1.26.6 → fal-1.27.1}/src/fal/toolkit/video/video.py +0 -0
  160. {fal-1.26.6 → fal-1.27.1}/src/fal/utils.py +0 -0
  161. {fal-1.26.6 → fal-1.27.1}/src/fal/workflows.py +0 -0
  162. {fal-1.26.6 → fal-1.27.1}/tests/__init__.py +0 -0
  163. {fal-1.26.6 → fal-1.27.1}/tests/assets/cat.png +0 -0
  164. {fal-1.26.6 → fal-1.27.1}/tests/cli/__init__.py +0 -0
  165. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_apps.py +0 -0
  166. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_auth.py +0 -0
  167. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_deploy.py +0 -0
  168. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_keys.py +0 -0
  169. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_run.py +0 -0
  170. {fal-1.26.6 → fal-1.27.1}/tests/cli/test_secrets.py +0 -0
  171. {fal-1.26.6 → fal-1.27.1}/tests/conftest.py +0 -0
  172. {fal-1.26.6 → fal-1.27.1}/tests/integration_test.py +0 -0
  173. {fal-1.26.6 → fal-1.27.1}/tests/mainify_package/__init__.py +0 -0
  174. {fal-1.26.6 → fal-1.27.1}/tests/mainify_package/impl.py +0 -0
  175. {fal-1.26.6 → fal-1.27.1}/tests/mainify_package/utils.py +0 -0
  176. {fal-1.26.6 → fal-1.27.1}/tests/mainify_target.py +0 -0
  177. {fal-1.26.6 → fal-1.27.1}/tests/test_apps.py +0 -0
  178. {fal-1.26.6 → fal-1.27.1}/tests/test_files.py +0 -0
  179. {fal-1.26.6 → fal-1.27.1}/tests/test_kv.py +0 -0
  180. {fal-1.26.6 → fal-1.27.1}/tests/test_stability.py +0 -0
  181. {fal-1.26.6 → fal-1.27.1}/tests/toolkit/file/providers/test_fal_retry.py +0 -0
  182. {fal-1.26.6 → fal-1.27.1}/tests/toolkit/file_test.py +0 -0
  183. {fal-1.26.6 → fal-1.27.1}/tests/toolkit/image_test.py +0 -0
  184. {fal-1.26.6 → fal-1.27.1}/tests/toolkit/test_types.py +0 -0
  185. {fal-1.26.6 → fal-1.27.1}/tests/toolkit/utils/retry.py +0 -0
  186. {fal-1.26.6 → fal-1.27.1}/tools/demo_script.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.26.6
3
+ Version: 1.27.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.26.6
3
+ Version: 1.27.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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.26.6'
21
- __version_tuple__ = version_tuple = (1, 26, 6)
20
+ __version__ = version = '1.27.1'
21
+ __version_tuple__ = version_tuple = (1, 27, 1)
@@ -61,7 +61,7 @@ def get_builtin_repository(id: RepositoryId | FileRepository) -> FileRepository:
61
61
  get_builtin_repository.__module__ = "__main__"
62
62
 
63
63
  DEFAULT_REPOSITORY: FileRepository | RepositoryId = "fal_v3"
64
- FALLBACK_REPOSITORY: FileRepository | RepositoryId = "fal"
64
+ FALLBACK_REPOSITORY: list[FileRepository | RepositoryId] = ["cdn", "fal"]
65
65
  OBJECT_LIFECYCLE_PREFERENCE_KEY = "x-fal-object-lifecycle-preference"
66
66
 
67
67
 
@@ -104,7 +104,7 @@ class Image(File):
104
104
  file_name: str | None = None,
105
105
  repository: FileRepository | RepositoryId = DEFAULT_REPOSITORY,
106
106
  fallback_repository: Optional[
107
- FileRepository | RepositoryId
107
+ FileRepository | RepositoryId | list[FileRepository | RepositoryId]
108
108
  ] = FALLBACK_REPOSITORY,
109
109
  request: Optional[Request] = None,
110
110
  ) -> Image:
@@ -128,7 +128,7 @@ class Image(File):
128
128
  file_name: str | None = None,
129
129
  repository: FileRepository | RepositoryId = DEFAULT_REPOSITORY,
130
130
  fallback_repository: Optional[
131
- FileRepository | RepositoryId
131
+ FileRepository | RepositoryId | list[FileRepository | RepositoryId]
132
132
  ] = FALLBACK_REPOSITORY,
133
133
  request: Optional[Request] = None,
134
134
  ) -> Image:
@@ -6,6 +6,7 @@ import os
6
6
  import shutil
7
7
  import subprocess
8
8
  import sys
9
+ import time
9
10
  from contextlib import suppress
10
11
  from pathlib import Path, PurePath
11
12
  from tempfile import NamedTemporaryFile, TemporaryDirectory
@@ -345,6 +346,14 @@ def _stream_url_data_to_file(
345
346
  raise DownloadError("Received less data than expected from the server.")
346
347
 
347
348
 
349
+ def _mark_used_dir(dir: Path):
350
+ used_file = dir / ".fal_used"
351
+ day_ago = time.time() - 86400
352
+ if not used_file.exists() or used_file.stat().st_mtime < day_ago:
353
+ # Touch a last-used file to indicate that the weights have been used
354
+ used_file.touch()
355
+
356
+
348
357
  def download_model_weights(
349
358
  url: str, force: bool = False, request_headers: dict[str, str] | None = None
350
359
  ) -> Path:
@@ -375,19 +384,34 @@ def download_model_weights(
375
384
 
376
385
  if weights_dir.exists() and not force:
377
386
  try:
378
- weights_path = next(weights_dir.glob("*"))
387
+ # TODO: sometimes the directory can hold multiple files
388
+ # Example:
389
+ # .fal/model_weights/00155dc2d9579360d577d1a87d31b52c21135c14a5f44fcbab36fbb8352f3e0d # noqa: E501
390
+ # We need to either not allow multiple files in the directory or
391
+ # find the one that is the most recently used.
392
+ weights_path = next(
393
+ # Ignore .fal dotfiles since they are metadata files
394
+ f
395
+ for f in weights_dir.glob("*")
396
+ if not f.name.startswith(".fal")
397
+ )
398
+ _mark_used_dir(weights_dir)
379
399
  return weights_path
380
400
  # The model weights directory is empty, so we need to download the weights
381
401
  except StopIteration:
382
402
  pass
383
403
 
384
- return download_file(
404
+ path = download_file(
385
405
  url,
386
406
  target_dir=weights_dir,
387
407
  force=force,
388
408
  request_headers=request_headers,
389
409
  )
390
410
 
411
+ _mark_used_dir(weights_dir)
412
+
413
+ return path
414
+
391
415
 
392
416
  def clone_repository(
393
417
  https_url: 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
File without changes
File without changes
File without changes
File without changes
File without changes