fal 0.13.0__py3-none-any.whl → 0.15.0__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/__init__.py +4 -4
- fal/_serialization.py +159 -108
- fal/api.py +91 -36
- fal/app.py +3 -8
- fal/auth/__init__.py +1 -3
- fal/cli.py +3 -4
- fal/exceptions/__init__.py +1 -2
- fal/exceptions/_base.py +1 -12
- fal/exceptions/auth.py +2 -4
- fal/exceptions/handlers.py +8 -19
- fal/logging/isolate.py +8 -19
- fal/logging/user.py +1 -1
- fal/sdk.py +3 -3
- fal/toolkit/__init__.py +0 -2
- fal/toolkit/exceptions.py +0 -5
- fal/toolkit/file/__init__.py +1 -1
- fal/toolkit/file/file.py +58 -55
- fal/toolkit/file/providers/fal.py +2 -6
- fal/toolkit/file/providers/gcp.py +0 -2
- fal/toolkit/file/providers/r2.py +0 -2
- fal/toolkit/file/types.py +0 -4
- fal/toolkit/image/__init__.py +1 -1
- fal/toolkit/image/image.py +11 -15
- fal/toolkit/optimize.py +1 -3
- fal/toolkit/utils/__init__.py +1 -1
- fal/toolkit/utils/download_utils.py +2 -15
- fal/workflows.py +3 -2
- {fal-0.13.0.dist-info → fal-0.15.0.dist-info}/METADATA +40 -38
- {fal-0.13.0.dist-info → fal-0.15.0.dist-info}/RECORD +50 -51
- {fal-0.13.0.dist-info → fal-0.15.0.dist-info}/WHEEL +2 -1
- fal-0.15.0.dist-info/entry_points.txt +2 -0
- fal-0.15.0.dist-info/top_level.txt +2 -0
- fal/env.py +0 -3
- fal/toolkit/mainify.py +0 -13
- fal-0.13.0.dist-info/entry_points.txt +0 -4
fal/toolkit/image/image.py
CHANGED
|
@@ -2,13 +2,12 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import io
|
|
4
4
|
from tempfile import NamedTemporaryFile
|
|
5
|
-
from typing import TYPE_CHECKING, Literal,
|
|
5
|
+
from typing import TYPE_CHECKING, Literal, Union, Optional
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel, Field
|
|
8
8
|
|
|
9
9
|
from fal.toolkit.file.file import DEFAULT_REPOSITORY, File
|
|
10
|
-
from fal.toolkit.file.types import
|
|
11
|
-
from fal.toolkit.mainify import mainify
|
|
10
|
+
from fal.toolkit.file.types import FileRepository, RepositoryId
|
|
12
11
|
from fal.toolkit.utils.download_utils import _download_file_python
|
|
13
12
|
|
|
14
13
|
if TYPE_CHECKING:
|
|
@@ -25,7 +24,6 @@ ImageSizePreset = Literal[
|
|
|
25
24
|
]
|
|
26
25
|
|
|
27
26
|
|
|
28
|
-
@mainify
|
|
29
27
|
class ImageSize(BaseModel):
|
|
30
28
|
width: int = Field(
|
|
31
29
|
default=512, description="The width of the generated image.", gt=0, le=14142
|
|
@@ -46,7 +44,6 @@ IMAGE_SIZE_PRESETS: dict[ImageSizePreset, ImageSize] = {
|
|
|
46
44
|
|
|
47
45
|
ImageSizeInput = Union[ImageSize, ImageSizePreset]
|
|
48
46
|
|
|
49
|
-
@mainify
|
|
50
47
|
def get_image_size(source: ImageSizeInput) -> ImageSize:
|
|
51
48
|
if isinstance(source, ImageSize):
|
|
52
49
|
return source
|
|
@@ -59,18 +56,17 @@ def get_image_size(source: ImageSizeInput) -> ImageSize:
|
|
|
59
56
|
ImageFormat = Literal["png", "jpeg", "jpg", "webp", "gif"]
|
|
60
57
|
|
|
61
58
|
|
|
62
|
-
@mainify
|
|
63
59
|
class Image(File):
|
|
64
60
|
"""
|
|
65
61
|
Represents an image file.
|
|
66
62
|
"""
|
|
67
63
|
|
|
68
64
|
width: Optional[int] = Field(
|
|
69
|
-
description="The width of the image in pixels.",
|
|
65
|
+
None, description="The width of the image in pixels.",
|
|
70
66
|
examples=[1024],
|
|
71
67
|
)
|
|
72
68
|
height: Optional[int] = Field(
|
|
73
|
-
description="The height of the image in pixels.", examples=[1024]
|
|
69
|
+
None, description="The height of the image in pixels.", examples=[1024]
|
|
74
70
|
)
|
|
75
71
|
|
|
76
72
|
@classmethod
|
|
@@ -82,15 +78,15 @@ class Image(File):
|
|
|
82
78
|
file_name: str | None = None,
|
|
83
79
|
repository: FileRepository | RepositoryId = DEFAULT_REPOSITORY,
|
|
84
80
|
) -> Image:
|
|
85
|
-
|
|
86
|
-
data
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
file_data=file_data,
|
|
81
|
+
obj = super().from_bytes(
|
|
82
|
+
data,
|
|
83
|
+
content_type=f"image/{format}",
|
|
84
|
+
file_name=file_name,
|
|
90
85
|
repository=repository,
|
|
91
|
-
width=size.width if size else None,
|
|
92
|
-
height=size.height if size else None,
|
|
93
86
|
)
|
|
87
|
+
obj.width=size.width if size else None
|
|
88
|
+
obj.height=size.height if size else None
|
|
89
|
+
return obj
|
|
94
90
|
|
|
95
91
|
@classmethod
|
|
96
92
|
def from_pil(
|
fal/toolkit/optimize.py
CHANGED
|
@@ -4,13 +4,11 @@ import os
|
|
|
4
4
|
import traceback
|
|
5
5
|
from typing import TYPE_CHECKING, Any
|
|
6
6
|
|
|
7
|
-
from fal.toolkit.mainify import mainify
|
|
8
7
|
|
|
9
8
|
if TYPE_CHECKING:
|
|
10
9
|
import torch
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
@mainify
|
|
14
12
|
def optimize(
|
|
15
13
|
module: torch.nn.Module, *, optimization_config: dict[str, Any] | None = None
|
|
16
14
|
) -> torch.nn.Module:
|
|
@@ -41,7 +39,7 @@ def optimize(
|
|
|
41
39
|
module,
|
|
42
40
|
optimization_config=optimization_config,
|
|
43
41
|
)
|
|
44
|
-
except Exception
|
|
42
|
+
except Exception:
|
|
45
43
|
print(
|
|
46
44
|
"[WARNING] Failed to optimize module, falling back "
|
|
47
45
|
"to default torch execution."
|
fal/toolkit/utils/__init__.py
CHANGED
|
@@ -10,8 +10,6 @@ from tempfile import TemporaryDirectory
|
|
|
10
10
|
from urllib.parse import urlparse
|
|
11
11
|
from urllib.request import Request, urlopen
|
|
12
12
|
|
|
13
|
-
from fal.toolkit.mainify import mainify
|
|
14
|
-
|
|
15
13
|
FAL_PERSISTENT_DIR = PurePath("/data")
|
|
16
14
|
FAL_REPOSITORY_DIR = FAL_PERSISTENT_DIR / ".fal" / "repos"
|
|
17
15
|
FAL_MODEL_WEIGHTS_DIR = FAL_PERSISTENT_DIR / ".fal" / "model_weights"
|
|
@@ -23,12 +21,10 @@ TEMP_HEADERS = {
|
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
|
|
26
|
-
@mainify
|
|
27
24
|
class DownloadError(Exception):
|
|
28
25
|
pass
|
|
29
26
|
|
|
30
27
|
|
|
31
|
-
@mainify
|
|
32
28
|
def _hash_url(url: str) -> str:
|
|
33
29
|
"""Hashes a URL using SHA-256.
|
|
34
30
|
|
|
@@ -41,8 +37,7 @@ def _hash_url(url: str) -> str:
|
|
|
41
37
|
return hashlib.sha256(url.encode("utf-8")).hexdigest()
|
|
42
38
|
|
|
43
39
|
|
|
44
|
-
@
|
|
45
|
-
@lru_cache()
|
|
40
|
+
@lru_cache
|
|
46
41
|
def _get_remote_file_properties(url: str) -> tuple[str, int]:
|
|
47
42
|
"""Retrieves the file name and content length of a remote file.
|
|
48
43
|
|
|
@@ -83,7 +78,6 @@ def _get_remote_file_properties(url: str) -> tuple[str, int]:
|
|
|
83
78
|
return file_name, content_length
|
|
84
79
|
|
|
85
80
|
|
|
86
|
-
@mainify
|
|
87
81
|
def _file_content_length_matches(url: str, file_path: Path) -> bool:
|
|
88
82
|
"""Check if the local file's content length matches the expected remote
|
|
89
83
|
file's content length.
|
|
@@ -109,7 +103,6 @@ def _file_content_length_matches(url: str, file_path: Path) -> bool:
|
|
|
109
103
|
return local_file_content_length == remote_file_content_length
|
|
110
104
|
|
|
111
105
|
|
|
112
|
-
@mainify
|
|
113
106
|
def download_file(
|
|
114
107
|
url: str,
|
|
115
108
|
target_dir: str | Path,
|
|
@@ -154,7 +147,7 @@ def download_file(
|
|
|
154
147
|
|
|
155
148
|
# If target_dir is not an absolute path, use "/data" as the relative directory
|
|
156
149
|
if not target_dir_path.is_absolute():
|
|
157
|
-
target_dir_path = FAL_PERSISTENT_DIR / target_dir_path # type: ignore[assignment]
|
|
150
|
+
target_dir_path = Path(FAL_PERSISTENT_DIR / target_dir_path) # type: ignore[assignment]
|
|
158
151
|
|
|
159
152
|
target_path = target_dir_path.resolve() / file_name
|
|
160
153
|
|
|
@@ -185,7 +178,6 @@ def download_file(
|
|
|
185
178
|
return target_path
|
|
186
179
|
|
|
187
180
|
|
|
188
|
-
@mainify
|
|
189
181
|
def _download_file_python(url: str, target_path: Path | str) -> Path:
|
|
190
182
|
"""Download a file from a given URL and save it to a specified path using a
|
|
191
183
|
Python interface.
|
|
@@ -224,7 +216,6 @@ def _download_file_python(url: str, target_path: Path | str) -> Path:
|
|
|
224
216
|
return Path(target_path)
|
|
225
217
|
|
|
226
218
|
|
|
227
|
-
@mainify
|
|
228
219
|
def _stream_url_data_to_file(url: str, file_path: str, chunk_size_in_mb: int = 64):
|
|
229
220
|
"""Download data from a URL and stream it to a file.
|
|
230
221
|
|
|
@@ -273,7 +264,6 @@ def _stream_url_data_to_file(url: str, file_path: str, chunk_size_in_mb: int = 6
|
|
|
273
264
|
raise DownloadError("Received less data than expected from the server.")
|
|
274
265
|
|
|
275
266
|
|
|
276
|
-
@mainify
|
|
277
267
|
def download_model_weights(url: str, force: bool = False):
|
|
278
268
|
"""Downloads model weights from the specified URL and saves them to a
|
|
279
269
|
predefined directory.
|
|
@@ -313,7 +303,6 @@ def download_model_weights(url: str, force: bool = False):
|
|
|
313
303
|
)
|
|
314
304
|
|
|
315
305
|
|
|
316
|
-
@mainify
|
|
317
306
|
def clone_repository(
|
|
318
307
|
https_url: str,
|
|
319
308
|
*,
|
|
@@ -408,7 +397,6 @@ def clone_repository(
|
|
|
408
397
|
return local_repo_path
|
|
409
398
|
|
|
410
399
|
|
|
411
|
-
@mainify
|
|
412
400
|
def __add_local_path_to_sys_path(local_path: Path | str):
|
|
413
401
|
local_path_str = str(local_path)
|
|
414
402
|
|
|
@@ -416,7 +404,6 @@ def __add_local_path_to_sys_path(local_path: Path | str):
|
|
|
416
404
|
sys.path.insert(0, local_path_str)
|
|
417
405
|
|
|
418
406
|
|
|
419
|
-
@mainify
|
|
420
407
|
def _get_git_revision_hash(repo_path: Path) -> str:
|
|
421
408
|
import subprocess
|
|
422
409
|
|
fal/workflows.py
CHANGED
|
@@ -18,6 +18,7 @@ from rich.syntax import Syntax
|
|
|
18
18
|
|
|
19
19
|
import fal
|
|
20
20
|
from fal import flags
|
|
21
|
+
from fal.exceptions import FalServerlessException
|
|
21
22
|
from fal.rest_client import REST_CLIENT
|
|
22
23
|
|
|
23
24
|
JSONType = Union[dict[str, Any], list[Any], str, int, float, bool, None, "Leaf"]
|
|
@@ -31,7 +32,7 @@ INPUT_VARIABLE_NAME = "input"
|
|
|
31
32
|
WORKFLOW_EXPORT_VERSION = "0.1"
|
|
32
33
|
|
|
33
34
|
|
|
34
|
-
class WorkflowSyntaxError(
|
|
35
|
+
class WorkflowSyntaxError(FalServerlessException):
|
|
35
36
|
pass
|
|
36
37
|
|
|
37
38
|
|
|
@@ -471,7 +472,7 @@ def main() -> None:
|
|
|
471
472
|
context.vars[node_id] = node.execute(context)
|
|
472
473
|
|
|
473
474
|
console.print(
|
|
474
|
-
|
|
475
|
+
"🎉 Execution complete!",
|
|
475
476
|
style="bold green",
|
|
476
477
|
)
|
|
477
478
|
output = context.hydrate(workflow.output)
|
|
@@ -1,44 +1,47 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.15.0
|
|
4
4
|
Summary: fal is an easy-to-use Serverless Python Framework
|
|
5
|
-
Author: Features & Labels
|
|
6
|
-
|
|
7
|
-
Requires-Python: >=3.8,<4.0
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
-
Requires-Dist: attrs (>=21.3.0)
|
|
15
|
-
Requires-Dist: click (>=8.1.3,<9.0.0)
|
|
16
|
-
Requires-Dist: colorama (>=0.4.6,<0.5.0)
|
|
17
|
-
Requires-Dist: dill (==0.3.7)
|
|
18
|
-
Requires-Dist: fastapi (==0.99.1)
|
|
19
|
-
Requires-Dist: grpc-interceptor (>=0.15.0,<0.16.0)
|
|
20
|
-
Requires-Dist: grpcio (>=1.50.0,<2.0.0)
|
|
21
|
-
Requires-Dist: httpx (>=0.15.4)
|
|
22
|
-
Requires-Dist: importlib-metadata (>=4.4) ; python_version < "3.10"
|
|
23
|
-
Requires-Dist: isolate-proto (>=0.3.4,<0.4.0)
|
|
24
|
-
Requires-Dist: isolate[build] (>=0.12.3,<1.0)
|
|
25
|
-
Requires-Dist: msgpack (>=1.0.7,<2.0.0)
|
|
26
|
-
Requires-Dist: opentelemetry-api (>=1.15.0,<2.0.0)
|
|
27
|
-
Requires-Dist: opentelemetry-sdk (>=1.15.0,<2.0.0)
|
|
28
|
-
Requires-Dist: packaging (>=21.3)
|
|
29
|
-
Requires-Dist: pathspec (>=0.11.1,<0.12.0)
|
|
30
|
-
Requires-Dist: pillow (>=10.2.0,<11.0.0)
|
|
31
|
-
Requires-Dist: portalocker (>=2.7.0,<3.0.0)
|
|
32
|
-
Requires-Dist: pydantic (<2.0)
|
|
33
|
-
Requires-Dist: pyjwt[crypto] (>=2.8.0,<3.0.0)
|
|
34
|
-
Requires-Dist: python-dateutil (>=2.8.0,<3.0.0)
|
|
35
|
-
Requires-Dist: rich (>=13.3.2,<14.0.0)
|
|
36
|
-
Requires-Dist: rich_click
|
|
37
|
-
Requires-Dist: structlog (>=22.3.0,<23.0.0)
|
|
38
|
-
Requires-Dist: types-python-dateutil (>=2.8.0,<3.0.0)
|
|
39
|
-
Requires-Dist: typing-extensions (>=4.7.1,<5.0.0)
|
|
40
|
-
Requires-Dist: websockets (>=12.0,<13.0)
|
|
5
|
+
Author: Features & Labels <hello@fal.ai>
|
|
6
|
+
Requires-Python: >=3.8
|
|
41
7
|
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: isolate[build] <1.0,>=0.12.3
|
|
9
|
+
Requires-Dist: isolate-proto ==0.3.4
|
|
10
|
+
Requires-Dist: grpcio <2,>=1.50.0
|
|
11
|
+
Requires-Dist: dill ==0.3.7
|
|
12
|
+
Requires-Dist: cloudpickle ==3.0.0
|
|
13
|
+
Requires-Dist: typing-extensions <5,>=4.7.1
|
|
14
|
+
Requires-Dist: click <9,>=8.1.3
|
|
15
|
+
Requires-Dist: structlog <23,>=22.3.0
|
|
16
|
+
Requires-Dist: opentelemetry-api <2,>=1.15.0
|
|
17
|
+
Requires-Dist: opentelemetry-sdk <2,>=1.15.0
|
|
18
|
+
Requires-Dist: grpc-interceptor <1,>=0.15.0
|
|
19
|
+
Requires-Dist: colorama <1,>=0.4.6
|
|
20
|
+
Requires-Dist: portalocker <3,>=2.7.0
|
|
21
|
+
Requires-Dist: rich <14,>=13.3.2
|
|
22
|
+
Requires-Dist: rich-click
|
|
23
|
+
Requires-Dist: packaging <22,>=21.3
|
|
24
|
+
Requires-Dist: pathspec <1,>=0.11.1
|
|
25
|
+
Requires-Dist: pydantic !=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<3
|
|
26
|
+
Requires-Dist: fastapi <1,>=0.99.1
|
|
27
|
+
Requires-Dist: starlette-exporter >=0.21.0
|
|
28
|
+
Requires-Dist: httpx >=0.15.4
|
|
29
|
+
Requires-Dist: attrs >=21.3.0
|
|
30
|
+
Requires-Dist: python-dateutil <3,>=2.8.0
|
|
31
|
+
Requires-Dist: types-python-dateutil <3,>=2.8.0
|
|
32
|
+
Requires-Dist: msgpack <2,>=1.0.7
|
|
33
|
+
Requires-Dist: websockets <13,>=12.0
|
|
34
|
+
Requires-Dist: pillow <11,>=10.2.0
|
|
35
|
+
Requires-Dist: pyjwt[crypto] <3,>=2.8.0
|
|
36
|
+
Requires-Dist: uvicorn <1,>=0.29.0
|
|
37
|
+
Requires-Dist: importlib-metadata >=4.4 ; python_version < "3.10"
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: fal[test] ; extra == 'dev'
|
|
40
|
+
Requires-Dist: openapi-python-client <1,>=0.14.1 ; extra == 'dev'
|
|
41
|
+
Provides-Extra: test
|
|
42
|
+
Requires-Dist: pytest ; extra == 'test'
|
|
43
|
+
Requires-Dist: pytest-xdist ; extra == 'test'
|
|
44
|
+
Requires-Dist: pytest-asyncio ; extra == 'test'
|
|
42
45
|
|
|
43
46
|
[](https://pypi.org/project/fal)
|
|
44
47
|
[](https://github.com/fal-ai/fal/actions)
|
|
@@ -86,4 +89,3 @@ A new virtual environment will be created by fal in the cloud and the set of req
|
|
|
86
89
|
## Next steps
|
|
87
90
|
|
|
88
91
|
If you would like to find out more about the capabilities of fal, check out to the [docs](https://fal.ai/docs). You can learn more about persistent storage, function caches and deploying your functions as API endpoints.
|
|
89
|
-
|
|
@@ -1,4 +1,49 @@
|
|
|
1
|
+
fal/__init__.py,sha256=XOobhu3D94O9K9ka_AJh6sw3K7lV-s_NuSto_fx9TXg,1255
|
|
2
|
+
fal/__main__.py,sha256=8hDtWlaFZK24KhfNq_ZKgtXqYHsDQDetukOCMlsbW0Q,59
|
|
3
|
+
fal/_serialization.py,sha256=d7cyacqQwwmSJJOh7WMGdv4jBzpLQJRsXxJc-GfhWN4,7517
|
|
4
|
+
fal/api.py,sha256=7LChw4fl1ClJa7qDcL2V7wwb_Eiw8c3QwPZhtt9PBqg,35975
|
|
5
|
+
fal/app.py,sha256=GCHes5uFQIH4cpK3YiiRSrsWSSkzWxlYh2T-nKra7Z8,12398
|
|
6
|
+
fal/apps.py,sha256=UhR6mq8jBiTAp-QvUnvbnMNcuJ5wHIKSqdlfyx8aBQ8,6829
|
|
7
|
+
fal/cli.py,sha256=STeefdtKG9RSeVXOKWtWtxNZTgvZX7Z3s80br8HZyK8,18374
|
|
8
|
+
fal/flags.py,sha256=AATQO65M4C87dGp0j7o6cSQWcr62xE-8DnJYsUjFFbw,942
|
|
9
|
+
fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
|
|
11
|
+
fal/sdk.py,sha256=TNmxxte-oca8WnaiXwc7MIMrUKn_OeYaXtg1xC8t7eM,18793
|
|
12
|
+
fal/sync.py,sha256=Ljet584PVFz4r888-0bwV1Kio-tTneF_85TnHvBPvJw,4277
|
|
13
|
+
fal/workflows.py,sha256=oBOdCCnZ0qMtmuO5JVpXD4FyUWoQgLXAJRe8RtrsGDw,14510
|
|
14
|
+
fal/auth/__init__.py,sha256=VTZfex_kV9WNozmpBDa7joNntOlz-btuu-wHqaGM9Bk,3555
|
|
15
|
+
fal/auth/auth0.py,sha256=5y4-9udOSX2-N_zvinLCpFwl10MdaPydZX2v9GQMZEE,5406
|
|
16
|
+
fal/auth/local.py,sha256=lZqp4j32l2xFpY8zYvLoIHHyJrNAJDcm5MxgsLpY_pw,1786
|
|
17
|
+
fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
|
|
18
|
+
fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
|
|
19
|
+
fal/console/ux.py,sha256=KMQs3UHQvVHDxDQQqlot-WskVKoMQXOE3jiVkkfmIMY,356
|
|
20
|
+
fal/exceptions/__init__.py,sha256=MM9N4uG3_6UkAGw4SLDo-Cp35YawNc1kAIGMl1BFTeI,992
|
|
21
|
+
fal/exceptions/_base.py,sha256=U3n_4OtUx5MvfT2eol_a-N0dV9_eYFMvdbrhP-b_NXg,160
|
|
22
|
+
fal/exceptions/auth.py,sha256=gxRago5coI__vSIcdcsqhhq1lRPkvCnwPAueIaXTAdw,329
|
|
23
|
+
fal/exceptions/handlers.py,sha256=nZCmmWU47k4P9NBISNqn0b6-L53KMoNuuGBW4G9Bweo,1674
|
|
24
|
+
fal/logging/__init__.py,sha256=snqprf7-sKw6oAATS_Yxklf-a3XhLg0vIHICPwLp6TM,1583
|
|
25
|
+
fal/logging/isolate.py,sha256=rQbM-wwsCO3ddIFyEo34GBWxDWkDzw3x0iSK79D0yKk,1742
|
|
26
|
+
fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
|
|
27
|
+
fal/logging/trace.py,sha256=OhzB6d4rQZimBc18WFLqH_9BGfqFFumKKTAGSsmWRMg,1904
|
|
28
|
+
fal/logging/user.py,sha256=0Xvb8n6tSb9l_V51VDzv6SOdYEFNouV_6nF_W9e7uNQ,642
|
|
29
|
+
fal/toolkit/__init__.py,sha256=sV95wiUzKoiDqF9vDgq4q-BLa2sD6IpuKSqp5kdTQNE,658
|
|
30
|
+
fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
|
|
31
|
+
fal/toolkit/optimize.py,sha256=I-scpgmRODkzBCLkcsBwxkVm9L4bGVkSSZKiKMFYU0M,1340
|
|
32
|
+
fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
|
|
33
|
+
fal/toolkit/file/file.py,sha256=_Kt-jqFoUdJ_UxSC7Ll6oeVWtkvjYZBJWONp31UvK7w,6025
|
|
34
|
+
fal/toolkit/file/types.py,sha256=9CqDh8SmNJNzfsrvtj468uo2SprJH9rOk8KMhhfU73c,1050
|
|
35
|
+
fal/toolkit/file/providers/fal.py,sha256=7oqzkmeNoXjRZKsSIInC1ZdX8-lmYamIZmgWtNrYpJo,3314
|
|
36
|
+
fal/toolkit/file/providers/gcp.py,sha256=7Lg7BXoHKkFu0jkGv3_vKh2Ks6eRfDMbw31N3mvDUtk,1913
|
|
37
|
+
fal/toolkit/file/providers/r2.py,sha256=YW5aJBOX41MQxfx1rA_f-IiJhAPMZ5md0cxBcg3y08I,2537
|
|
38
|
+
fal/toolkit/image/__init__.py,sha256=qNLyXsBWysionUjbeWbohLqWlw3G_UpzunamkZd_JLQ,71
|
|
39
|
+
fal/toolkit/image/image.py,sha256=7Hy0Mxb_QAJI1o-5ycYGES4ReB3iLSmxVkCIX2Y6MEs,4252
|
|
40
|
+
fal/toolkit/utils/__init__.py,sha256=CrmM9DyCz5-SmcTzRSm5RaLgxy3kf0ZsSEN9uhnX2Xo,97
|
|
41
|
+
fal/toolkit/utils/download_utils.py,sha256=9rYLDOztOoib7TqCXuGj05nPmcgd3Soj0AT16O_sczA,15460
|
|
1
42
|
openapi_fal_rest/__init__.py,sha256=ziculmF_i6trw63LzZGFX-6W3Lwq9mCR8_UpkpvpaHI,152
|
|
43
|
+
openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
|
|
44
|
+
openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
|
|
45
|
+
openapi_fal_rest/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
|
|
46
|
+
openapi_fal_rest/types.py,sha256=GLwJwOotUOdfqryo_r0naw55-dh6Ilm4IvxePekSACk,994
|
|
2
47
|
openapi_fal_rest/api/__init__.py,sha256=87ApBzKyGb5zsgTMOkQXDqsLZCmaSFoJMwbGzCDQZMw,47
|
|
3
48
|
openapi_fal_rest/api/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
49
|
openapi_fal_rest/api/applications/app_metadata.py,sha256=GqG6Q7jt8Jcyhb3ms_6i0M1B3cy205y3_A8W-AGEapY,5120
|
|
@@ -13,8 +58,6 @@ openapi_fal_rest/api/workflows/delete_workflow_workflows_user_id_workflow_name_d
|
|
|
13
58
|
openapi_fal_rest/api/workflows/execute_workflow_workflows_user_id_workflow_name_post.py,sha256=kofDDU3TEVQ8Fmua_K2-lk5xh16g6_FNFHQ0KzoFMcM,8743
|
|
14
59
|
openapi_fal_rest/api/workflows/get_workflow_workflows_user_id_workflow_name_get.py,sha256=-E-TELi9Q_-yqobdHAcTHVm-8HithJRUGk7wc1mLA18,4763
|
|
15
60
|
openapi_fal_rest/api/workflows/get_workflows_workflows_get.py,sha256=iJF3lNYp22p8-JbbBMDoHO9iXQB8779lSnH2fNimYP4,5242
|
|
16
|
-
openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
|
|
17
|
-
openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
|
|
18
61
|
openapi_fal_rest/models/__init__.py,sha256=pGB91qXG3VDxob4DPAh3OMa2fyJFYBxc-jQ-9A4y3Gs,2037
|
|
19
62
|
openapi_fal_rest/models/app_metadata_response_app_metadata.py,sha256=1vx_5cp8V0jyE8iBRIe8TfngaeXMojfEpMCpT6i3qvs,1252
|
|
20
63
|
openapi_fal_rest/models/body_upload_local_file.py,sha256=rOTEbYBXfwZk8TsywZWSPPQQEfJgvsLIufT6A40RJZs,1980
|
|
@@ -38,52 +81,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
|
|
|
38
81
|
openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
|
|
39
82
|
openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
|
|
40
83
|
openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
fal/
|
|
44
|
-
fal/
|
|
45
|
-
fal
|
|
46
|
-
fal/api.py,sha256=YNiX6QCDYDdfqccHzsOd0YYBDslkzVNhlDUxPubYsb4,34033
|
|
47
|
-
fal/app.py,sha256=KAIgvBBpvzp6oY8BpH5hFOLDUpG4bjtwlV5jPGj2IE0,12487
|
|
48
|
-
fal/apps.py,sha256=UhR6mq8jBiTAp-QvUnvbnMNcuJ5wHIKSqdlfyx8aBQ8,6829
|
|
49
|
-
fal/auth/__init__.py,sha256=ZnR1fxonzDk0UhS3-i33Kq2xOrN-leYXvJ-Ddnj94xc,3594
|
|
50
|
-
fal/auth/auth0.py,sha256=5y4-9udOSX2-N_zvinLCpFwl10MdaPydZX2v9GQMZEE,5406
|
|
51
|
-
fal/auth/local.py,sha256=lZqp4j32l2xFpY8zYvLoIHHyJrNAJDcm5MxgsLpY_pw,1786
|
|
52
|
-
fal/cli.py,sha256=RCjns-r2yyJ6AmDFMkOxhKcZqtK5gY2lruA9ympdcUc,18432
|
|
53
|
-
fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
|
|
54
|
-
fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
|
|
55
|
-
fal/console/ux.py,sha256=KMQs3UHQvVHDxDQQqlot-WskVKoMQXOE3jiVkkfmIMY,356
|
|
56
|
-
fal/env.py,sha256=-fA8x62BbOX3MOuO0maupa-_QJ9PNwr8ogfeG11QUyQ,53
|
|
57
|
-
fal/exceptions/__init__.py,sha256=A8oJQQQlb8WQieusFK6O4CBc4s6CUSiNgj0xVKJKvgg,1012
|
|
58
|
-
fal/exceptions/_base.py,sha256=LeQmx-soL_-s1742WKN18VwTVjUuYP0L0BdQHPJBpM4,460
|
|
59
|
-
fal/exceptions/auth.py,sha256=01Ro7SyGJpwchubdHe14Cl6-Al1jUj16Sy4BvakNWf4,384
|
|
60
|
-
fal/exceptions/handlers.py,sha256=3z4DGTErw0zW3UW4p3JltlqpsMV10kqMtFOxpniMSBU,2105
|
|
61
|
-
fal/flags.py,sha256=AATQO65M4C87dGp0j7o6cSQWcr62xE-8DnJYsUjFFbw,942
|
|
62
|
-
fal/logging/__init__.py,sha256=snqprf7-sKw6oAATS_Yxklf-a3XhLg0vIHICPwLp6TM,1583
|
|
63
|
-
fal/logging/isolate.py,sha256=yDW_P4aR-t53IRmvD2Iprufv1Wn-xQXoBbMB2Ufr59s,2122
|
|
64
|
-
fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
|
|
65
|
-
fal/logging/trace.py,sha256=OhzB6d4rQZimBc18WFLqH_9BGfqFFumKKTAGSsmWRMg,1904
|
|
66
|
-
fal/logging/user.py,sha256=A8vbZX9z13TPZEDzvlbvCDDdD0EL1KrCP3qHdrT58-A,632
|
|
67
|
-
fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
-
fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
|
|
69
|
-
fal/sdk.py,sha256=Z3MQsD8MMQZq_GEC2VjaYChdNafFJtsgdk77-VK6N44,18782
|
|
70
|
-
fal/sync.py,sha256=Ljet584PVFz4r888-0bwV1Kio-tTneF_85TnHvBPvJw,4277
|
|
71
|
-
fal/toolkit/__init__.py,sha256=JDNBT_duflp93geeAzw2kFmGzG5odWnPJEXFLXE2nF4,713
|
|
72
|
-
fal/toolkit/exceptions.py,sha256=--WKKYxUop6WFy_vqAPXK6uH8C-JR98gnNXwhHNCb7E,258
|
|
73
|
-
fal/toolkit/file/__init__.py,sha256=YpUU6YziZV1AMuq12L0EDWToS0sgpHSGWsARbiOEHWk,56
|
|
74
|
-
fal/toolkit/file/file.py,sha256=ku4agJiGXU2gdfZmFrU5mDlVsag834zoeskbo-6ErEU,5926
|
|
75
|
-
fal/toolkit/file/providers/fal.py,sha256=hO59loXzGP4Vg-Q1FFR56nWbbI6BccJRnFsEI6z6EQE,3404
|
|
76
|
-
fal/toolkit/file/providers/gcp.py,sha256=Bq5SJSghXF8YfFnbZ83_mPdrWs2dFhi8ytODp92USgk,1962
|
|
77
|
-
fal/toolkit/file/providers/r2.py,sha256=xJtZfX3cfzJgLXS3F8mHArbrHi0_QBpIMy5M4-tS8H8,2586
|
|
78
|
-
fal/toolkit/file/types.py,sha256=MTIj6Y_ioL4CiMZXMiqx74vlmUifc3SNvcrWAXQfULE,1109
|
|
79
|
-
fal/toolkit/image/__init__.py,sha256=liEq0CqkRqUQ1udnnyGVFBwCXUhR2f6o5ffbtbAlP8o,57
|
|
80
|
-
fal/toolkit/image/image.py,sha256=bF1PzO4cJoFGJFpQYeG0sNaGuw3cC1zmobmbZrxbPFY,4339
|
|
81
|
-
fal/toolkit/mainify.py,sha256=E7gE45nZQZoaJdSlIq0mqajcH-IjcuPBWFmKm5hvhAU,406
|
|
82
|
-
fal/toolkit/optimize.py,sha256=OIhX0T-efRMgUJDpvL0bujdun5SovZgTdKxNOv01b_Y,1394
|
|
83
|
-
fal/toolkit/utils/__init__.py,sha256=b3zVpm50Upx1saXU7RiV9r9in6-Chs4OU9KRjBv7MYI,83
|
|
84
|
-
fal/toolkit/utils/download_utils.py,sha256=bigcLJjLK1OBAGxpYisJ0-5vcQCh0HAPuCykPrcCNd0,15596
|
|
85
|
-
fal/workflows.py,sha256=hkyDk5KQCDcjyUbo_IhQePGP8t4nxzZ7Uw6rVbLtdq4,14448
|
|
86
|
-
fal-0.13.0.dist-info/METADATA,sha256=hSwlEAJ4BckX_kbNubsEbDnSzssvFstbSwCvYWOnq70,3263
|
|
87
|
-
fal-0.13.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
88
|
-
fal-0.13.0.dist-info/entry_points.txt,sha256=nE9GBVV3PdBosudFwbIzZQUe_9lfPR6EH8K_FdDASnM,62
|
|
89
|
-
fal-0.13.0.dist-info/RECORD,,
|
|
84
|
+
fal-0.15.0.dist-info/METADATA,sha256=GyZiaXubOMkUTFuwCBujAq0mHZPBnExycm_DTNqndzA,3258
|
|
85
|
+
fal-0.15.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
86
|
+
fal-0.15.0.dist-info/entry_points.txt,sha256=1GadEh1IgXO5Bb42Xo9lwNsJnm9Xjfo3qIdqwbfdV8Q,36
|
|
87
|
+
fal-0.15.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
|
|
88
|
+
fal-0.15.0.dist-info/RECORD,,
|
fal/env.py
DELETED
fal/toolkit/mainify.py
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# HACK: make classes dillable https://github.com/uqfoundation/dill/issues/424
|
|
5
|
-
# Only works for classes for now, must be outer-most decorator in most cases
|
|
6
|
-
def mainify(obj):
|
|
7
|
-
if hasattr(obj, "__module__") and obj.__module__.startswith("fal"):
|
|
8
|
-
obj.__module__ = "__main__"
|
|
9
|
-
|
|
10
|
-
for inner in obj.__dict__.values():
|
|
11
|
-
mainify(inner)
|
|
12
|
-
|
|
13
|
-
return obj
|