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.

@@ -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, Optional, Union
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 FileData, FileRepository, RepositoryId
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
- file_data = FileData(
86
- data=data, content_type=f"image/{format}", file_name=file_name
87
- )
88
- return cls(
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 as e:
42
+ except Exception:
45
43
  print(
46
44
  "[WARNING] Failed to optimize module, falling back "
47
45
  "to default torch execution."
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- from fal.toolkit.utils.download_utils import *
3
+ from fal.toolkit.utils.download_utils import * # noqa: F403
@@ -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
- @mainify
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(Exception):
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
- f"🎉 Execution complete!",
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.13.0
3
+ Version: 0.15.0
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
- Author: Features & Labels
6
- Author-email: hello@fal.ai
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
  [![PyPI](https://img.shields.io/pypi/v/fal.svg?logo=PyPI)](https://pypi.org/project/fal)
44
47
  [![Tests](https://img.shields.io/github/actions/workflow/status/fal-ai/fal/integration_tests.yaml?label=Tests)](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
- openapi_fal_rest/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
42
- openapi_fal_rest/types.py,sha256=GLwJwOotUOdfqryo_r0naw55-dh6Ilm4IvxePekSACk,994
43
- fal/__init__.py,sha256=6SvCuotCb0tuqSWDZSFDjtySktJ5m1QpVIlefumJpvM,1199
44
- fal/__main__.py,sha256=8hDtWlaFZK24KhfNq_ZKgtXqYHsDQDetukOCMlsbW0Q,59
45
- fal/_serialization.py,sha256=PK8E6Z1-_E3IYnt5pNWWViOas0SMZTvpNE7a2arj_3U,4948
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,,
@@ -1,4 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ fal = fal.cli:cli
@@ -0,0 +1,2 @@
1
+ fal
2
+ openapi_fal_rest
fal/env.py DELETED
@@ -1,3 +0,0 @@
1
- from __future__ import annotations
2
-
3
- CLI_ENV = "prod"
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
@@ -1,4 +0,0 @@
1
- [console_scripts]
2
- fal=fal.cli:cli
3
- fal-serverless=fal.cli:cli
4
-