fal 1.20.0__py3-none-any.whl → 1.20.2__py3-none-any.whl
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.
- fal/_fal_version.py +2 -2
- fal/api.py +3 -0
- fal/cli/files.py +30 -4
- fal/toolkit/__init__.py +10 -6
- fal/toolkit/audio/audio.py +12 -0
- fal/toolkit/file/file.py +9 -0
- fal/toolkit/image/image.py +9 -0
- fal/toolkit/video/video.py +12 -0
- {fal-1.20.0.dist-info → fal-1.20.2.dist-info}/METADATA +1 -1
- {fal-1.20.0.dist-info → fal-1.20.2.dist-info}/RECORD +13 -13
- {fal-1.20.0.dist-info → fal-1.20.2.dist-info}/WHEEL +0 -0
- {fal-1.20.0.dist-info → fal-1.20.2.dist-info}/entry_points.txt +0 -0
- {fal-1.20.0.dist-info → fal-1.20.2.dist-info}/top_level.txt +0 -0
fal/_fal_version.py
CHANGED
fal/api.py
CHANGED
|
@@ -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
|
)
|
fal/cli/files.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
fal/toolkit/__init__.py
CHANGED
|
@@ -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",
|
fal/toolkit/audio/audio.py
CHANGED
|
@@ -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"}}}
|
fal/toolkit/file/file.py
CHANGED
|
@@ -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(
|
fal/toolkit/image/image.py
CHANGED
|
@@ -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.
|
fal/toolkit/video/video.py
CHANGED
|
@@ -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"}}}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
fal/__init__.py,sha256=wXs1G0gSc7ZK60-bHe-B2m0l_sA6TrFk4BxY0tMoLe8,784
|
|
2
2
|
fal/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83
|
|
3
|
-
fal/_fal_version.py,sha256=
|
|
3
|
+
fal/_fal_version.py,sha256=oOzN_eFDSujB4KWlmhVE07aE_rxlU2LHUbGm5yjyaoc,513
|
|
4
4
|
fal/_serialization.py,sha256=npXNsFJ5G7jzBeBIyVMH01Ww34mGY4XWhHpRbSrTtnQ,7598
|
|
5
5
|
fal/_version.py,sha256=1BbTFnucNC_6ldKJ_ZoC722_UkW4S9aDBSW9L0fkKAw,2315
|
|
6
|
-
fal/api.py,sha256=
|
|
6
|
+
fal/api.py,sha256=_TaUcdTUNz5GnjGd3On1FeDSJ0zVJwZQZqAMn3_Yddw,46451
|
|
7
7
|
fal/app.py,sha256=S5VHxDaj5J9YVC8ECenHCZJlTHalapHyOyHbCBNsDfs,24153
|
|
8
8
|
fal/apps.py,sha256=pzCd2mrKl5J_4oVc40_pggvPtFahXBCdrZXWpnaEJVs,12130
|
|
9
9
|
fal/config.py,sha256=BEMH10B2bfWJ9yNawnLG6v3kBLnLmkhMe201EAODzs4,3124
|
|
@@ -30,7 +30,7 @@ fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
|
|
|
30
30
|
fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
|
|
31
31
|
fal/cli/deploy.py,sha256=CWf0Y56w-hNCrht-qrfgiOi9nuvve1Kl5NFZJpt_oRA,7770
|
|
32
32
|
fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
|
|
33
|
-
fal/cli/files.py,sha256=
|
|
33
|
+
fal/cli/files.py,sha256=pSgAnTm2eHdP-IPkMIVfnK_Ii7mkSSOVgvbsiFUVBC0,2936
|
|
34
34
|
fal/cli/keys.py,sha256=7Sf4DT4le89G42eAOt0ltRjbZAtE70AVQ62hmjZhUy0,3059
|
|
35
35
|
fal/cli/main.py,sha256=ao8EEV_Fkd7AdN5En6k_dZWp158Et5DrqNRutl98MHY,3273
|
|
36
36
|
fal/cli/parser.py,sha256=jYsGQ0BLQuKI7KtN1jnLVYKMbLtez7hPjwTNfG3UPSk,2964
|
|
@@ -51,21 +51,21 @@ fal/logging/isolate.py,sha256=jIryi46ZVlJ1mfan4HLNQQ3jwMi8z-WwfqqLlttQVkc,2449
|
|
|
51
51
|
fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
|
|
52
52
|
fal/logging/trace.py,sha256=OhzB6d4rQZimBc18WFLqH_9BGfqFFumKKTAGSsmWRMg,1904
|
|
53
53
|
fal/logging/user.py,sha256=H7Pg-nqhpzsUb5f6uXyZUeLWAsr3oImQEaYSCIIAlqo,818
|
|
54
|
-
fal/toolkit/__init__.py,sha256=
|
|
54
|
+
fal/toolkit/__init__.py,sha256=GR5KxAsNODlhs-DTarJcb5raujActubn0afR7FPueWs,886
|
|
55
55
|
fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
|
|
56
56
|
fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
|
|
57
57
|
fal/toolkit/types.py,sha256=kkbOsDKj1qPGb1UARTBp7yuJ5JUuyy7XQurYUBCdti8,4064
|
|
58
58
|
fal/toolkit/audio/__init__.py,sha256=sqNVfrKbppWlIGLoFTaaNTxLpVXsFHxOSHLA5VG547A,35
|
|
59
|
-
fal/toolkit/audio/audio.py,sha256=
|
|
59
|
+
fal/toolkit/audio/audio.py,sha256=gt458h989iQ-EhQSH-mCuJuPBY4RneLJE05f_QWU1E0,572
|
|
60
60
|
fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
|
|
61
|
-
fal/toolkit/file/file.py,sha256=
|
|
61
|
+
fal/toolkit/file/file.py,sha256=7JWAwDqT3xnfCtPl75x1TpRmtJmWRRVvsGFMNUta3bY,9765
|
|
62
62
|
fal/toolkit/file/types.py,sha256=MMAH_AyLOhowQPesOv1V25wB4qgbJ3vYNlnTPbdSv1M,2304
|
|
63
63
|
fal/toolkit/file/providers/fal.py,sha256=vt4Mznbfca6blfk0psF1ix-zB6309kpIA0_5Qh7bmFw,47217
|
|
64
64
|
fal/toolkit/file/providers/gcp.py,sha256=DKeZpm1MjwbvEsYvkdXUtuLIJDr_UNbqXj_Mfv3NTeo,2437
|
|
65
65
|
fal/toolkit/file/providers/r2.py,sha256=YqnYkkAo_ZKIa-xoSuDnnidUFwJWHdziAR34PE6irdI,3061
|
|
66
66
|
fal/toolkit/file/providers/s3.py,sha256=EI45T54Mox7lHZKROss_O8o0DIn3CHP9k1iaNYVrxvg,2714
|
|
67
67
|
fal/toolkit/image/__init__.py,sha256=m3OatPbBhcEOYyaTu_dgToxunUKoJu4bJVCWUoN7HX4,1838
|
|
68
|
-
fal/toolkit/image/image.py,sha256=
|
|
68
|
+
fal/toolkit/image/image.py,sha256=GwTKEsbpoHLbaIQJuPjq4vKXuSttn2plCLoI_aLuYfI,5538
|
|
69
69
|
fal/toolkit/image/safety_checker.py,sha256=S7ow-HuoVxC6ixHWWcBrAUm2dIlgq3sTAIull6xIbAg,3105
|
|
70
70
|
fal/toolkit/image/nsfw_filter/__init__.py,sha256=0d9D51EhcnJg8cZLYJjgvQJDZT74CfQu6mpvinRYRpA,216
|
|
71
71
|
fal/toolkit/image/nsfw_filter/env.py,sha256=iAP2Q3vzIl--DD8nr8o3o0goAwhExN2v0feYE0nIQjs,212
|
|
@@ -77,7 +77,7 @@ fal/toolkit/utils/download_utils.py,sha256=IIb8eLsoFg4Gy-2N0M4trnxFUF75f1pWtjOX_
|
|
|
77
77
|
fal/toolkit/utils/endpoint.py,sha256=5EXoshA2PD_brjEfhNWAWasjqLOCRrjBnfhj6QGuMt8,782
|
|
78
78
|
fal/toolkit/utils/retry.py,sha256=0pnKqs1Y2dADMAk2944FZr68ZL3wQC_5hqApfgyMf_8,1531
|
|
79
79
|
fal/toolkit/video/__init__.py,sha256=YV0jWpuvoA_CDFQXhd3zOvilFLKH7DYARrbzR7hWhpE,35
|
|
80
|
-
fal/toolkit/video/video.py,sha256=
|
|
80
|
+
fal/toolkit/video/video.py,sha256=dHNMdV_zJHiJMzlfIiyDv7tqJBsD32aoc3Ao0t1nKNk,572
|
|
81
81
|
openapi_fal_rest/__init__.py,sha256=ziculmF_i6trw63LzZGFX-6W3Lwq9mCR8_UpkpvpaHI,152
|
|
82
82
|
openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
|
|
83
83
|
openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
|
|
@@ -141,8 +141,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
|
|
|
141
141
|
openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
|
|
142
142
|
openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
|
|
143
143
|
openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
|
|
144
|
-
fal-1.20.
|
|
145
|
-
fal-1.20.
|
|
146
|
-
fal-1.20.
|
|
147
|
-
fal-1.20.
|
|
148
|
-
fal-1.20.
|
|
144
|
+
fal-1.20.2.dist-info/METADATA,sha256=R0uG3AsFj6ZgzcOe-Q7O99Cuhks3e1uU6n31FUz1mCo,4085
|
|
145
|
+
fal-1.20.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
146
|
+
fal-1.20.2.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
|
|
147
|
+
fal-1.20.2.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
|
|
148
|
+
fal-1.20.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|