fal 1.2.1__py3-none-any.whl → 1.7.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.

Files changed (45) hide show
  1. fal/__main__.py +3 -1
  2. fal/_fal_version.py +2 -2
  3. fal/api.py +88 -20
  4. fal/app.py +221 -27
  5. fal/apps.py +147 -3
  6. fal/auth/__init__.py +50 -2
  7. fal/cli/_utils.py +40 -0
  8. fal/cli/apps.py +5 -3
  9. fal/cli/create.py +26 -0
  10. fal/cli/deploy.py +97 -16
  11. fal/cli/main.py +2 -2
  12. fal/cli/parser.py +11 -7
  13. fal/cli/run.py +12 -1
  14. fal/cli/runners.py +44 -0
  15. fal/config.py +23 -0
  16. fal/container.py +1 -1
  17. fal/exceptions/__init__.py +7 -1
  18. fal/exceptions/_base.py +51 -0
  19. fal/exceptions/_cuda.py +44 -0
  20. fal/files.py +81 -0
  21. fal/sdk.py +67 -6
  22. fal/toolkit/file/file.py +103 -13
  23. fal/toolkit/file/providers/fal.py +572 -24
  24. fal/toolkit/file/providers/gcp.py +8 -1
  25. fal/toolkit/file/providers/r2.py +8 -1
  26. fal/toolkit/file/providers/s3.py +80 -0
  27. fal/toolkit/file/types.py +28 -3
  28. fal/toolkit/image/__init__.py +71 -0
  29. fal/toolkit/image/image.py +25 -2
  30. fal/toolkit/image/nsfw_filter/__init__.py +11 -0
  31. fal/toolkit/image/nsfw_filter/env.py +9 -0
  32. fal/toolkit/image/nsfw_filter/inference.py +77 -0
  33. fal/toolkit/image/nsfw_filter/model.py +18 -0
  34. fal/toolkit/image/nsfw_filter/requirements.txt +4 -0
  35. fal/toolkit/image/safety_checker.py +107 -0
  36. fal/toolkit/types.py +140 -0
  37. fal/toolkit/utils/download_utils.py +4 -0
  38. fal/toolkit/utils/retry.py +45 -0
  39. fal/utils.py +20 -4
  40. fal/workflows.py +10 -4
  41. {fal-1.2.1.dist-info → fal-1.7.2.dist-info}/METADATA +47 -40
  42. {fal-1.2.1.dist-info → fal-1.7.2.dist-info}/RECORD +45 -30
  43. {fal-1.2.1.dist-info → fal-1.7.2.dist-info}/WHEEL +1 -1
  44. {fal-1.2.1.dist-info → fal-1.7.2.dist-info}/entry_points.txt +0 -0
  45. {fal-1.2.1.dist-info → fal-1.7.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,45 @@
1
+ import functools
2
+ import random
3
+ import time
4
+ import traceback
5
+ from typing import Any, Callable, Literal
6
+
7
+ BackoffType = Literal["exponential", "fixed"]
8
+
9
+
10
+ def retry(
11
+ max_retries: int = 3,
12
+ base_delay: float = 1.0,
13
+ max_delay: float = 60.0,
14
+ backoff_type: BackoffType = "exponential",
15
+ jitter: bool = False,
16
+ ) -> Callable:
17
+ def decorator(func: Callable) -> Callable:
18
+ @functools.wraps(func)
19
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
20
+ retries = 0
21
+ while retries < max_retries:
22
+ try:
23
+ return func(*args, **kwargs)
24
+ except Exception as e:
25
+ retries += 1
26
+ print(f"Retrying {retries} of {max_retries}...")
27
+ if retries == max_retries:
28
+ print(f"Max retries reached. Raising exception: {e}")
29
+ traceback.print_exc()
30
+
31
+ raise e
32
+
33
+ if backoff_type == "exponential":
34
+ delay = min(base_delay * (2 ** (retries - 1)), max_delay)
35
+ else: # fixed
36
+ delay = min(base_delay, max_delay)
37
+
38
+ if jitter:
39
+ delay *= random.uniform(0.5, 1.5)
40
+
41
+ time.sleep(delay)
42
+
43
+ return wrapper
44
+
45
+ return decorator
fal/utils.py CHANGED
@@ -1,22 +1,32 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from dataclasses import dataclass
4
+
3
5
  import fal._serialization
4
6
  from fal import App, wrap_app
5
7
 
6
8
  from .api import FalServerlessError, FalServerlessHost, IsolatedFunction
7
9
 
8
10
 
11
+ @dataclass
12
+ class LoadedFunction:
13
+ function: IsolatedFunction
14
+ endpoints: list[str]
15
+ app_name: str | None
16
+ app_auth: str | None
17
+
18
+
9
19
  def load_function_from(
10
20
  host: FalServerlessHost,
11
21
  file_path: str,
12
22
  function_name: str | None = None,
13
- ) -> tuple[IsolatedFunction, str | None]:
23
+ ) -> LoadedFunction:
14
24
  import runpy
15
25
 
16
26
  module = runpy.run_path(file_path)
17
27
  if function_name is None:
18
28
  fal_objects = {
19
- obj.app_name: obj_name
29
+ obj_name: obj
20
30
  for obj_name, obj in module.items()
21
31
  if isinstance(obj, type)
22
32
  and issubclass(obj, fal.App)
@@ -30,9 +40,12 @@ def load_function_from(
30
40
  "Please specify the name of the app."
31
41
  )
32
42
 
33
- [(app_name, function_name)] = fal_objects.items()
43
+ [(function_name, obj)] = fal_objects.items()
44
+ app_name = obj.app_name
45
+ app_auth = obj.app_auth
34
46
  else:
35
47
  app_name = None
48
+ app_auth = None
36
49
 
37
50
  if function_name not in module:
38
51
  raise FalServerlessError(f"Function '{function_name}' not found in module")
@@ -42,12 +55,15 @@ def load_function_from(
42
55
  fal._serialization.include_package_from_path(file_path)
43
56
 
44
57
  target = module[function_name]
58
+ endpoints = ["/"]
45
59
  if isinstance(target, type) and issubclass(target, App):
46
60
  app_name = target.app_name
61
+ app_auth = target.app_auth
62
+ endpoints = target.get_endpoints() or ["/"]
47
63
  target = wrap_app(target, host=host)
48
64
 
49
65
  if not isinstance(target, IsolatedFunction):
50
66
  raise FalServerlessError(
51
67
  f"Function '{function_name}' is not a fal.function or a fal.App"
52
68
  )
53
- return target, app_name
69
+ return LoadedFunction(target, endpoints, app_name=app_name, app_auth=app_auth)
fal/workflows.py CHANGED
@@ -5,7 +5,7 @@ import webbrowser
5
5
  from argparse import ArgumentParser
6
6
  from collections import Counter
7
7
  from dataclasses import dataclass, field
8
- from typing import Any, Iterator, Union, cast
8
+ from typing import Any, Dict, Iterator, List, Union, cast
9
9
 
10
10
  import graphlib
11
11
  import rich
@@ -21,8 +21,8 @@ from fal import flags
21
21
  from fal.exceptions import FalServerlessException
22
22
  from fal.rest_client import REST_CLIENT
23
23
 
24
- JSONType = Union[dict[str, Any], list[Any], str, int, float, bool, None, "Leaf"]
25
- SchemaType = dict[str, Any]
24
+ JSONType = Union[Dict[str, Any], List[Any], str, int, float, bool, None, "Leaf"]
25
+ SchemaType = Dict[str, Any]
26
26
 
27
27
  VARIABLE_PREFIX = "$"
28
28
  INPUT_VARIABLE_NAME = "input"
@@ -50,7 +50,13 @@ def parse_leaf(raw_leaf: str) -> Leaf:
50
50
  f"Invalid leaf: {raw_leaf} (must start with a reference)"
51
51
  )
52
52
 
53
- leaf: Leaf = ReferenceLeaf(reference.removeprefix(VARIABLE_PREFIX))
53
+ # remove the $ prefix
54
+ _reference = (
55
+ reference[len(VARIABLE_PREFIX) :]
56
+ if reference.startswith(VARIABLE_PREFIX)
57
+ else reference
58
+ )
59
+ leaf: Leaf = ReferenceLeaf(_reference)
54
60
  for raw_part in raw_parts:
55
61
  if raw_part.isdigit():
56
62
  leaf = IndexLeaf(leaf, int(raw_part))
@@ -1,49 +1,56 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: fal
3
- Version: 1.2.1
3
+ Version: 1.7.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
7
7
  Description-Content-Type: text/markdown
8
- Requires-Dist: isolate[build] <1.14.0,>=0.13.0
9
- Requires-Dist: isolate-proto ==0.5.1
10
- Requires-Dist: grpcio ==1.64.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-argparse
23
- Requires-Dist: packaging >=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'
8
+ Requires-Dist: isolate[build]<0.16.0,>=0.15.0
9
+ Requires-Dist: isolate-proto<0.7.0,>=0.6.0
10
+ Requires-Dist: grpcio==1.64.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_argparse
23
+ Requires-Dist: packaging>=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: structlog>=22.0
27
+ Requires-Dist: fastapi<1,>=0.99.1
28
+ Requires-Dist: starlette-exporter>=0.21.0
29
+ Requires-Dist: httpx>=0.15.4
30
+ Requires-Dist: attrs>=21.3.0
31
+ Requires-Dist: python-dateutil<3,>=2.8.0
32
+ Requires-Dist: types-python-dateutil<3,>=2.8.0
33
+ Requires-Dist: importlib-metadata>=4.4; python_version < "3.10"
34
+ Requires-Dist: msgpack<2,>=1.0.7
35
+ Requires-Dist: websockets<13,>=12.0
36
+ Requires-Dist: pillow<11,>=10.2.0
37
+ Requires-Dist: pyjwt[crypto]<3,>=2.8.0
38
+ Requires-Dist: uvicorn<1,>=0.29.0
39
+ Requires-Dist: cookiecutter
40
+ Requires-Dist: tomli
41
+ Provides-Extra: docs
42
+ Requires-Dist: sphinx; extra == "docs"
43
+ Requires-Dist: sphinx-rtd-theme; extra == "docs"
44
+ Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
41
45
  Provides-Extra: test
42
- Requires-Dist: pytest <8 ; extra == 'test'
43
- Requires-Dist: pytest-asyncio ; extra == 'test'
44
- Requires-Dist: pytest-xdist ; extra == 'test'
45
- Requires-Dist: flaky ; extra == 'test'
46
- Requires-Dist: boto3 ; extra == 'test'
46
+ Requires-Dist: pytest<8; extra == "test"
47
+ Requires-Dist: pytest-asyncio; extra == "test"
48
+ Requires-Dist: pytest-xdist; extra == "test"
49
+ Requires-Dist: flaky; extra == "test"
50
+ Requires-Dist: boto3; extra == "test"
51
+ Provides-Extra: dev
52
+ Requires-Dist: fal[docs,test]; extra == "dev"
53
+ Requires-Dist: openapi-python-client<1,>=0.14.1; extra == "dev"
47
54
 
48
55
  [![PyPI](https://img.shields.io/pypi/v/fal.svg?logo=PyPI)](https://pypi.org/project/fal)
49
56
  [![Tests](https://img.shields.io/github/actions/workflow/status/fal-ai/fal/integration_tests.yaml?label=Tests)](https://github.com/fal-ai/fal/actions)
@@ -1,38 +1,44 @@
1
1
  fal/__init__.py,sha256=wXs1G0gSc7ZK60-bHe-B2m0l_sA6TrFk4BxY0tMoLe8,784
2
- fal/__main__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
3
- fal/_fal_version.py,sha256=2U0Gn26fYI3Vgj5hgkLM8I3wI6YEVdffJGllaVW-sSc,411
2
+ fal/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83
3
+ fal/_fal_version.py,sha256=Qj1rYkRQ0hSV6NX03bgvPhjsn6HWrQ8maBXi446C5ZM,411
4
4
  fal/_serialization.py,sha256=rD2YiSa8iuzCaZohZwN_MPEB-PpSKbWRDeaIDpTEjyY,7653
5
5
  fal/_version.py,sha256=EBGqrknaf1WygENX-H4fBefLvHryvJBBGtVJetaB0NY,266
6
- fal/api.py,sha256=x60GlBWynDd1yhHsVWeqf07WVTzgbwNC6cqCjhlTiFQ,40556
7
- fal/app.py,sha256=duOf_YKE8o30hmhNtF9zvkT8wlKYXW7hdQLJtPrXHik,15793
8
- fal/apps.py,sha256=FrKmaAUo8U9vE_fcva0GQvk4sCrzaTEr62lGtu3Ld5M,6825
9
- fal/container.py,sha256=V7riyyq8AZGwEX9QaqRQDZyDN_bUKeRKV1OOZArXjL0,622
6
+ fal/api.py,sha256=u9QfJtb1nLDJu9kegKCrdvW-Cp0mfMSGTPm5X1ywoeE,43388
7
+ fal/app.py,sha256=C1dTWjit90XdTKmrwd5Aqv3SD0MA1JDZoLLtmStn2Xc,22917
8
+ fal/apps.py,sha256=RpmElElJnDYjsTRQOdNYiJwd74GEOGYA38L5O5GzNEg,11068
9
+ fal/config.py,sha256=hgI3kW4_2NoFsrYEiPss0mnDTr8_Td2z0pVgm93wi9o,600
10
+ fal/container.py,sha256=EjokKTULJ3fPUjDttjir-jmg0gqcUDe0iVzW2j5njec,634
11
+ fal/files.py,sha256=QgfYfMKmNobMPufrAP_ga1FKcIAlSbw18Iar1-0qepo,2650
10
12
  fal/flags.py,sha256=oWN_eidSUOcE9wdPK_77si3A1fpgOC0UEERPsvNLIMc,842
11
13
  fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
14
  fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
13
- fal/sdk.py,sha256=wA58DYnSK1vdsBi8Or9Z8kvMMEyBNfeZYk_xulSfTWE,20078
15
+ fal/sdk.py,sha256=HjlToPJkG0Z5h_D0D2FK43i3JFKeO4r2IhCGx4B82Z8,22564
14
16
  fal/sync.py,sha256=ZuIJA2-hTPNANG9B_NNJZUsO68EIdTH0dc9MzeVE2VU,4340
15
- fal/utils.py,sha256=pstF7-13xjB1gKOtzz4tIXc8b8nMSDd9HO79WCiVrt4,1753
16
- fal/workflows.py,sha256=jx3tGy2R7cN6lLvOzT6lhhlcjmiq64iZls2smVrmQj0,14657
17
- fal/auth/__init__.py,sha256=r8iA2-5ih7-Fik3gEC4HEWNFbGoxpYnXpZu1icPIoS0,3561
17
+ fal/utils.py,sha256=9q_QrQBlQN3nZYA1kEGRfhJWi4RjnO4H1uQswfaei9w,2146
18
+ fal/workflows.py,sha256=Zl4f6Bs085hY40zmqScxDUyCu7zXkukDbW02iYOLTTI,14805
19
+ fal/auth/__init__.py,sha256=MXwS5zyY1SYJWEkc6s39et73Dkg3cDJg1ZwxRhXNj4c,4704
18
20
  fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
19
21
  fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
20
22
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
21
- fal/cli/apps.py,sha256=GlQSEE68HYfnhK90WIiOx611tcVkkbc9bu_10FMaFLY,8143
23
+ fal/cli/_utils.py,sha256=45G0LEz2bW-69MUQKPdatVE_CBC2644gC-V0qdNEsco,1252
24
+ fal/cli/apps.py,sha256=Fo4iUpd6FGTUcIp22WcssE1CaEn_BLKzK_E4JPsXhVI,8179
22
25
  fal/cli/auth.py,sha256=--MhfHGwxmtHbRkGioyn1prKn_U-pBzbz0G_QeZou-U,1352
26
+ fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
23
27
  fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
24
- fal/cli/deploy.py,sha256=jA-C4Pvzie70MVDnaFKc6ByfBrNFeaMROAKX98RD8tQ,4785
28
+ fal/cli/deploy.py,sha256=-woTZObzntUenPFmWJwDaeCmBl3Vb7jqSkhPCIfk2SM,7581
25
29
  fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
26
30
  fal/cli/keys.py,sha256=trDpA3LJu9S27qE_K8Hr6fKLK4vwVzbxUHq8TFrV4pw,3157
27
- fal/cli/main.py,sha256=MxETDhqIT37quMbmofSMxBcAFOhnEHjpQ_pYEtOhApM,1993
28
- fal/cli/parser.py,sha256=r1hd5e8Jq6yzDZw8-S0On1EjJbjRtHMuVuHC6MlvUj4,2835
29
- fal/cli/run.py,sha256=enhnpqo07PzGK2uh8M522zenNWxrBFOqb3oMZ8XiWdg,870
31
+ fal/cli/main.py,sha256=O0i9wdLPxcd1u4CvXit-ufkT_UnON-baTN6v9HaHPmw,2027
32
+ fal/cli/parser.py,sha256=edCqFWYAQSOhrxeEK9BtFRlTEUAlG2JUDjS_vhZ_nHE,2868
33
+ fal/cli/run.py,sha256=nAC12Qss4Fg1XmV0qOS9RdGNLYcdoHeRgQMvbTN4P9I,1202
34
+ fal/cli/runners.py,sha256=5pXuKq7nSkf0VpnppNnvxwP8XDq0SWkc6mkfizDwWMQ,1046
30
35
  fal/cli/secrets.py,sha256=740msFm7d41HruudlcfqUXlFl53N-WmChsQP9B9M9Po,2572
31
36
  fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
32
37
  fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
33
38
  fal/console/ux.py,sha256=KMQs3UHQvVHDxDQQqlot-WskVKoMQXOE3jiVkkfmIMY,356
34
- fal/exceptions/__init__.py,sha256=x3fp97qMr5zCQJghMq6k2ESXWSrkWumO1BZebh3pWsI,92
35
- fal/exceptions/_base.py,sha256=oF2XfitbiDGObmSF1IX50uAdV8IUvOfR-YsGmMQSE0A,161
39
+ fal/exceptions/__init__.py,sha256=m2okJEpax11mnwmoqO_pCGtbt-FvzKiiuMhKo2ok-_8,270
40
+ fal/exceptions/_base.py,sha256=LwzpMaW_eYQEC5s26h2qGXbNA-S4bOqC8s-bMCX6HjE,1491
41
+ fal/exceptions/_cuda.py,sha256=q5EPFYEb7Iyw03cHrQlRHnH5xOvjwTwQdM6a9N3GB8k,1494
36
42
  fal/exceptions/auth.py,sha256=gxRago5coI__vSIcdcsqhhq1lRPkvCnwPAueIaXTAdw,329
37
43
  fal/logging/__init__.py,sha256=snqprf7-sKw6oAATS_Yxklf-a3XhLg0vIHICPwLp6TM,1583
38
44
  fal/logging/isolate.py,sha256=jJSgDHkFg4sB0xElYSqCYF6IAxy6jEgSfjwFuKJIZbA,2305
@@ -42,16 +48,25 @@ fal/logging/user.py,sha256=0Xvb8n6tSb9l_V51VDzv6SOdYEFNouV_6nF_W9e7uNQ,642
42
48
  fal/toolkit/__init__.py,sha256=sV95wiUzKoiDqF9vDgq4q-BLa2sD6IpuKSqp5kdTQNE,658
43
49
  fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
44
50
  fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
51
+ fal/toolkit/types.py,sha256=kkbOsDKj1qPGb1UARTBp7yuJ5JUuyy7XQurYUBCdti8,4064
45
52
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
46
- fal/toolkit/file/file.py,sha256=_OCtg0Po3wlDT41dMThJJ1Z9XLtnajyjYaupO9DhfeQ,6137
47
- fal/toolkit/file/types.py,sha256=bJCeV5NPcpJYJoglailiRgFsuNAfcextYA8Et5-XUag,1060
48
- fal/toolkit/file/providers/fal.py,sha256=65-BkK9jhGBwYI_OjhHJsL2DthyKxBBRrqXPI_ZN4-k,4115
49
- fal/toolkit/file/providers/gcp.py,sha256=pUVH2qNcnO_VrDQQU8MmfYOQZMGaKQIqE4yGnYdQhAc,2003
50
- fal/toolkit/file/providers/r2.py,sha256=WxmOHF5WxHt6tKMcFjWj7ZWO8a1EXysO9lfYv_tB3MI,2627
51
- fal/toolkit/image/__init__.py,sha256=qNLyXsBWysionUjbeWbohLqWlw3G_UpzunamkZd_JLQ,71
52
- fal/toolkit/image/image.py,sha256=UDIHgkxae8LzmCvWBM9GayMnK8c0JMMfsrVlLnW5rto,4234
53
+ fal/toolkit/file/file.py,sha256=-gccCKnarTu6Nfm_0yQ0sJM9aadB5tUNvKS1PTqxiFc,9071
54
+ fal/toolkit/file/types.py,sha256=MjZ6xAhKPv4rowLo2Vcbho0sX7AQ3lm3KFyYDcw0dL4,1845
55
+ fal/toolkit/file/providers/fal.py,sha256=Z3Bl7uzBxyckDwopRJRMwygm68nycE41voLw6mnK_BI,22464
56
+ fal/toolkit/file/providers/gcp.py,sha256=iQtkoYUqbmKKpC5srVOYtrruZ3reGRm5lz4kM8bshgk,2247
57
+ fal/toolkit/file/providers/r2.py,sha256=G2OHcCH2yWrVtXT4hWHEXUeEjFhbKO0koqHcd7hkczk,2871
58
+ fal/toolkit/file/providers/s3.py,sha256=CfiA6rTBFfP-empp0cB9OW2c9F5iy0Z-kGwCs5HBICU,2524
59
+ fal/toolkit/image/__init__.py,sha256=m3OatPbBhcEOYyaTu_dgToxunUKoJu4bJVCWUoN7HX4,1838
60
+ fal/toolkit/image/image.py,sha256=ZSkozciP4XxaGnvrR_mP4utqE3_QhoPN0dau9FJ2Xco,5033
61
+ fal/toolkit/image/safety_checker.py,sha256=S7ow-HuoVxC6ixHWWcBrAUm2dIlgq3sTAIull6xIbAg,3105
62
+ fal/toolkit/image/nsfw_filter/__init__.py,sha256=0d9D51EhcnJg8cZLYJjgvQJDZT74CfQu6mpvinRYRpA,216
63
+ fal/toolkit/image/nsfw_filter/env.py,sha256=iAP2Q3vzIl--DD8nr8o3o0goAwhExN2v0feYE0nIQjs,212
64
+ fal/toolkit/image/nsfw_filter/inference.py,sha256=BhIPF_zxRLetThQYxDDF0sdx9VRwvu74M5ye6Povi40,2167
65
+ fal/toolkit/image/nsfw_filter/model.py,sha256=63mu8D15z_IosoRUagRLGHy6VbLqFmrG-yZqnu2vVm4,457
66
+ fal/toolkit/image/nsfw_filter/requirements.txt,sha256=3Pmrd0Ny6QAeBqUNHCgffRyfaCARAPJcfSCX5cRYpbM,37
53
67
  fal/toolkit/utils/__init__.py,sha256=CrmM9DyCz5-SmcTzRSm5RaLgxy3kf0ZsSEN9uhnX2Xo,97
54
- fal/toolkit/utils/download_utils.py,sha256=9WMpn0mFIhkFelQpPj5KG-pC7RMyyOzGHbNRDSyz07o,17664
68
+ fal/toolkit/utils/download_utils.py,sha256=fFrKoSJPBSurrD636ncNHhJv-cS3zReIv6ltiU3tMZU,17823
69
+ fal/toolkit/utils/retry.py,sha256=mHcQvvNIpu-Hi29P1HXSZuyvolRd48dMaJToqzlG0NY,1353
55
70
  openapi_fal_rest/__init__.py,sha256=ziculmF_i6trw63LzZGFX-6W3Lwq9mCR8_UpkpvpaHI,152
56
71
  openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
57
72
  openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
@@ -115,8 +130,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
115
130
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
116
131
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
117
132
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
118
- fal-1.2.1.dist-info/METADATA,sha256=1ViXkmFXOXQqD52q0HPxP-BuzHL5RzQ6x6MC__GOXn4,3777
119
- fal-1.2.1.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
120
- fal-1.2.1.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
121
- fal-1.2.1.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
122
- fal-1.2.1.dist-info/RECORD,,
133
+ fal-1.7.2.dist-info/METADATA,sha256=WkJRSNM2kZUjycgksVYKCIH_z6GD5ks1W5bbteDQp2A,3996
134
+ fal-1.7.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
135
+ fal-1.7.2.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
136
+ fal-1.7.2.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
137
+ fal-1.7.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.3.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5