fal 1.1.0__py3-none-any.whl → 1.2.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/_fal_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.1.0'
16
- __version_tuple__ = version_tuple = (1, 1, 0)
15
+ __version__ = version = '1.2.0'
16
+ __version_tuple__ = version_tuple = (1, 2, 0)
fal/_serialization.py CHANGED
@@ -186,8 +186,8 @@ def _patch_rlock() -> None:
186
186
 
187
187
  def pickle_rlock(obj: RLockType) -> tuple[Callable, tuple]:
188
188
  r = obj.__repr__()
189
- count = int(r.split('count=')[1].split()[0].rstrip('>'))
190
- owner = int(r.split('owner=')[1].split()[0])
189
+ count = int(r.split("count=")[1].split()[0].rstrip(">"))
190
+ owner = int(r.split("owner=")[1].split()[0])
191
191
 
192
192
  return create_rlock, (count, owner)
193
193
 
@@ -209,7 +209,7 @@ def _patch_console_thread_locals() -> None:
209
209
  "buffer": obj.buffer,
210
210
  "buffer_index": obj.buffer_index,
211
211
  }
212
- return create_locals, (kwargs, )
212
+ return create_locals, (kwargs,)
213
213
 
214
214
  _register(ConsoleThreadLocals, pickle_locals)
215
215
 
@@ -231,4 +231,3 @@ def patch_pickle() -> None:
231
231
  _patch_exceptions()
232
232
 
233
233
  _register_pickle_by_value("fal")
234
-
fal/apps.py CHANGED
@@ -24,8 +24,7 @@ def _backwards_compatible_app_id(app_id: str) -> str:
24
24
 
25
25
 
26
26
  @dataclass
27
- class _Status:
28
- ...
27
+ class _Status: ...
29
28
 
30
29
 
31
30
  @dataclass
fal/cli/apps.py CHANGED
@@ -203,7 +203,6 @@ def _runners(args):
203
203
 
204
204
  from fal.sdk import FalServerlessClient
205
205
 
206
-
207
206
  client = FalServerlessClient(args.host)
208
207
  with client.connect() as connection:
209
208
  runners = connection.list_alias_runners(alias=args.app_name)
fal/cli/debug.py CHANGED
@@ -47,11 +47,7 @@ def debugtools(args):
47
47
  def get_debug_parser():
48
48
  parser = FalParser(add_help=False)
49
49
  group = parser.add_argument_group(title="Debug")
50
- group.add_argument(
51
- "--debug",
52
- action="store_true",
53
- help="Show verbose errors."
54
- )
50
+ group.add_argument("--debug", action="store_true", help="Show verbose errors.")
55
51
  group.add_argument(
56
52
  "--pdb",
57
53
  action="store_true",
fal/cli/deploy.py CHANGED
@@ -69,9 +69,7 @@ def _deploy(args):
69
69
  # Try to find a python file in the current directory
70
70
  options = list(Path(".").glob("*.py"))
71
71
  if len(options) == 0:
72
- raise FalServerlessError(
73
- "No python files found in the current directory"
74
- )
72
+ raise FalServerlessError("No python files found in the current directory")
75
73
  elif len(options) > 1:
76
74
  raise FalServerlessError(
77
75
  "Multiple python files found in the current directory. "
@@ -107,8 +105,12 @@ def _deploy(args):
107
105
  "Registered a new revision for function "
108
106
  f"'{app_name}' (revision='{app_id}')."
109
107
  )
110
- args.console.print(f"Playground: https://fal.ai/models/{user.username}/{app_name}")
111
- args.console.print(f"Endpoint: https://{gateway_host}/{user.username}/{app_name}")
108
+ args.console.print(
109
+ f"Playground: https://fal.ai/models/{user.username}/{app_name}"
110
+ )
111
+ args.console.print(
112
+ f"Endpoint: https://{gateway_host}/{user.username}/{app_name}"
113
+ )
112
114
 
113
115
 
114
116
  def add_parser(main_subparsers, parents):
@@ -139,8 +141,7 @@ def add_parser(main_subparsers, parents):
139
141
  nargs="?",
140
142
  action=RefAction,
141
143
  help=(
142
- "Application reference. "
143
- "For example: `myfile.py::MyApp`, `myfile.py`."
144
+ "Application reference. " "For example: `myfile.py::MyApp`, `myfile.py`."
144
145
  ),
145
146
  )
146
147
  parser.add_argument(
fal/cli/keys.py CHANGED
@@ -56,7 +56,10 @@ def _list(args):
56
56
  keys = connection.list_user_keys()
57
57
  for key in keys:
58
58
  table.add_row(
59
- key.key_id, str(key.created_at), str(key.scope.value), key.alias,
59
+ key.key_id,
60
+ str(key.created_at),
61
+ str(key.scope.value),
62
+ key.alias,
60
63
  )
61
64
 
62
65
  args.console.print(table)
fal/cli/run.py CHANGED
@@ -14,10 +14,7 @@ def _run(args):
14
14
 
15
15
  def add_parser(main_subparsers, parents):
16
16
  run_help = "Run fal function."
17
- epilog = (
18
- "Examples:\n"
19
- " fal run path/to/myfile.py::myfunc"
20
- )
17
+ epilog = "Examples:\n" " fal run path/to/myfile.py::myfunc"
21
18
  parser = main_subparsers.add_parser(
22
19
  "run",
23
20
  description=run_help,
fal/cli/secrets.py CHANGED
@@ -1,9 +1,9 @@
1
-
2
1
  from .parser import DictAction, FalClientParser
3
2
 
4
3
 
5
4
  def _set(args):
6
5
  from fal.sdk import FalServerlessClient
6
+
7
7
  client = FalServerlessClient(args.host)
8
8
  with client.connect() as connection:
9
9
  for name, value in args.secrets.items():
@@ -12,10 +12,7 @@ def _set(args):
12
12
 
13
13
  def _add_set_parser(subparsers, parents):
14
14
  set_help = "Set a secret."
15
- epilog = (
16
- "Examples:\n"
17
- " fal secrets set HF_TOKEN=hf_***"
18
- )
15
+ epilog = "Examples:\n" " fal secrets set HF_TOKEN=hf_***"
19
16
 
20
17
  parser = subparsers.add_parser(
21
18
  "set",
@@ -64,6 +61,7 @@ def _add_list_parser(subparsers, parents):
64
61
 
65
62
  def _unset(args):
66
63
  from fal.sdk import FalServerlessClient
64
+
67
65
  client = FalServerlessClient(args.host)
68
66
  with client.connect() as connection:
69
67
  connection.delete_secret(args.secret)
fal/exceptions/_base.py CHANGED
@@ -3,4 +3,5 @@ from __future__ import annotations
3
3
 
4
4
  class FalServerlessException(Exception):
5
5
  """Base exception type for fal Serverless related flows and APIs."""
6
+
6
7
  pass
fal/logging/isolate.py CHANGED
@@ -13,7 +13,6 @@ _renderer = ConsoleRenderer(level_styles=LEVEL_STYLES)
13
13
 
14
14
 
15
15
  class IsolateLogPrinter:
16
-
17
16
  debug: bool
18
17
 
19
18
  def __init__(self, debug: bool = False) -> None:
fal/sdk.py CHANGED
@@ -277,7 +277,7 @@ class KeyScope(enum.Enum):
277
277
 
278
278
  @from_grpc.register(isolate_proto.ApplicationInfo)
279
279
  def _from_grpc_application_info(
280
- message: isolate_proto.ApplicationInfo
280
+ message: isolate_proto.ApplicationInfo,
281
281
  ) -> ApplicationInfo:
282
282
  return ApplicationInfo(
283
283
  application_id=message.application_id,
fal/toolkit/file/file.py CHANGED
@@ -15,6 +15,7 @@ if not hasattr(pydantic, "__version__") or pydantic.__version__.startswith("1.")
15
15
  else:
16
16
  from pydantic import GetCoreSchemaHandler
17
17
  from pydantic_core import CoreSchema, core_schema
18
+
18
19
  IS_PYDANTIC_V2 = True
19
20
 
20
21
  from pydantic import BaseModel, Field
@@ -22,6 +23,7 @@ from pydantic import BaseModel, Field
22
23
  from fal.toolkit.file.providers.fal import (
23
24
  FalCDNFileRepository,
24
25
  FalFileRepository,
26
+ FalFileRepositoryV2,
25
27
  InMemoryRepository,
26
28
  )
27
29
  from fal.toolkit.file.providers.gcp import GoogleStorageRepository
@@ -33,6 +35,7 @@ FileRepositoryFactory = Callable[[], FileRepository]
33
35
 
34
36
  BUILT_IN_REPOSITORIES: dict[RepositoryId, FileRepositoryFactory] = {
35
37
  "fal": lambda: FalFileRepository(),
38
+ "fal_v2": lambda: FalFileRepositoryV2(),
36
39
  "in_memory": lambda: InMemoryRepository(),
37
40
  "gcp_storage": lambda: GoogleStorageRepository(),
38
41
  "r2": lambda: R2Repository(),
@@ -26,8 +26,8 @@ GLOBAL_LIFECYCLE_PREFERENCE = ObjectLifecyclePreference(
26
26
 
27
27
 
28
28
  @dataclass
29
- class FalFileRepository(FileRepository):
30
- def save(self, file: FileData) -> str:
29
+ class FalFileRepositoryBase(FileRepository):
30
+ def _save(self, file: FileData, storage_type: str) -> str:
31
31
  key_creds = key_credentials()
32
32
  if not key_creds:
33
33
  raise FileUploadException("FAL_KEY must be set")
@@ -41,7 +41,9 @@ class FalFileRepository(FileRepository):
41
41
 
42
42
  grpc_host = os.environ.get("FAL_HOST", "api.alpha.fal.ai")
43
43
  rest_host = grpc_host.replace("api", "rest", 1)
44
- storage_url = f"https://{rest_host}/storage/upload/initiate"
44
+ storage_url = (
45
+ f"https://{rest_host}/storage/upload/initiate?storage_type={storage_type}"
46
+ )
45
47
 
46
48
  try:
47
49
  req = Request(
@@ -79,6 +81,18 @@ class FalFileRepository(FileRepository):
79
81
  return
80
82
 
81
83
 
84
+ @dataclass
85
+ class FalFileRepository(FalFileRepositoryBase):
86
+ def save(self, file: FileData) -> str:
87
+ return self._save(file, "gcs")
88
+
89
+
90
+ @dataclass
91
+ class FalFileRepositoryV2(FalFileRepositoryBase):
92
+ def save(self, file: FileData) -> str:
93
+ return self._save(file, "fal-cdn")
94
+
95
+
82
96
  @dataclass
83
97
  class InMemoryRepository(FileRepository):
84
98
  def save(
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import datetime
4
4
  import json
5
5
  import os
6
+ import posixpath
7
+ import uuid
6
8
  from dataclasses import dataclass
7
9
 
8
10
  from fal.toolkit.file.types import FileData, FileRepository
@@ -49,7 +51,10 @@ class GoogleStorageRepository(FileRepository):
49
51
  return self._bucket
50
52
 
51
53
  def save(self, data: FileData) -> str:
52
- destination_path = os.path.join(self.folder, data.file_name)
54
+ destination_path = posixpath.join(
55
+ self.folder,
56
+ f"{uuid.uuid4().hex}_{data.file_name}",
57
+ )
53
58
 
54
59
  gcp_blob = self.bucket.blob(destination_path)
55
60
  gcp_blob.upload_from_string(data.data, content_type=data.content_type)
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import os
5
+ import posixpath
6
+ import uuid
5
7
  from dataclasses import dataclass
6
8
  from io import BytesIO
7
9
 
@@ -66,7 +68,10 @@ class R2Repository(FileRepository):
66
68
  return self._bucket
67
69
 
68
70
  def save(self, data: FileData) -> str:
69
- destination_path = os.path.join(self.key, data.file_name)
71
+ destination_path = posixpath.join(
72
+ self.key,
73
+ f"{uuid.uuid4().hex}_{data.file_name}",
74
+ )
70
75
 
71
76
  s3_object = self.bucket.Object(destination_path)
72
77
  s3_object.upload_fileobj(
fal/toolkit/file/types.py CHANGED
@@ -28,7 +28,7 @@ class FileData:
28
28
  self.file_name = file_name
29
29
 
30
30
 
31
- RepositoryId = Literal["fal", "in_memory", "gcp_storage", "r2", "cdn"]
31
+ RepositoryId = Literal["fal", "fal_v2", "in_memory", "gcp_storage", "r2", "cdn"]
32
32
 
33
33
 
34
34
  @dataclass
@@ -44,6 +44,7 @@ IMAGE_SIZE_PRESETS: dict[ImageSizePreset, ImageSize] = {
44
44
 
45
45
  ImageSizeInput = Union[ImageSize, ImageSizePreset]
46
46
 
47
+
47
48
  def get_image_size(source: ImageSizeInput) -> ImageSize:
48
49
  if isinstance(source, ImageSize):
49
50
  return source
@@ -62,7 +63,8 @@ class Image(File):
62
63
  """
63
64
 
64
65
  width: Optional[int] = Field(
65
- None, description="The width of the image in pixels.",
66
+ None,
67
+ description="The width of the image in pixels.",
66
68
  examples=[1024],
67
69
  )
68
70
  height: Optional[int] = Field(
@@ -84,8 +86,8 @@ class Image(File):
84
86
  file_name=file_name,
85
87
  repository=repository,
86
88
  )
87
- obj.width=size.width if size else None
88
- obj.height=size.height if size else None
89
+ obj.width = size.width if size else None
90
+ obj.height = size.height if size else None
89
91
  return obj
90
92
 
91
93
  @classmethod
@@ -120,9 +122,7 @@ class Image(File):
120
122
  from PIL import Image as PILImage
121
123
  from PIL import ImageOps
122
124
  except ImportError:
123
- raise ImportError(
124
- "The PIL package is required to use Image.to_pil()."
125
- )
125
+ raise ImportError("The PIL package is required to use Image.to_pil().")
126
126
 
127
127
  # Stream the image data from url to a temp file and convert it to a PIL image
128
128
  with NamedTemporaryFile() as temp_file:
@@ -134,4 +134,3 @@ class Image(File):
134
134
  img = ImageOps.exif_transpose(img)
135
135
 
136
136
  return img
137
-
fal/utils.py CHANGED
@@ -51,4 +51,3 @@ def load_function_from(
51
51
  f"Function '{function_name}' is not a fal.function or a fal.App"
52
52
  )
53
53
  return target, app_name
54
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.1.0
3
+ Version: 1.2.0
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,41 +1,41 @@
1
1
  fal/__init__.py,sha256=wXs1G0gSc7ZK60-bHe-B2m0l_sA6TrFk4BxY0tMoLe8,784
2
2
  fal/__main__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
3
- fal/_fal_version.py,sha256=CqDGE4B1ZqZ-56mxeOFcXRTmlxrdOh4ayrjbcPjziE4,411
4
- fal/_serialization.py,sha256=7urrZXw99qmsK-RkjCurk6Va4TMEfDIMajkzKbSW4j4,7655
3
+ fal/_fal_version.py,sha256=zMnMemknXglcJs59xkicNzeEJTVgYd1omSfLWj76yWw,411
4
+ fal/_serialization.py,sha256=rD2YiSa8iuzCaZohZwN_MPEB-PpSKbWRDeaIDpTEjyY,7653
5
5
  fal/_version.py,sha256=EBGqrknaf1WygENX-H4fBefLvHryvJBBGtVJetaB0NY,266
6
6
  fal/api.py,sha256=x60GlBWynDd1yhHsVWeqf07WVTzgbwNC6cqCjhlTiFQ,40556
7
7
  fal/app.py,sha256=duOf_YKE8o30hmhNtF9zvkT8wlKYXW7hdQLJtPrXHik,15793
8
- fal/apps.py,sha256=UhR6mq8jBiTAp-QvUnvbnMNcuJ5wHIKSqdlfyx8aBQ8,6829
8
+ fal/apps.py,sha256=FrKmaAUo8U9vE_fcva0GQvk4sCrzaTEr62lGtu3Ld5M,6825
9
9
  fal/container.py,sha256=V7riyyq8AZGwEX9QaqRQDZyDN_bUKeRKV1OOZArXjL0,622
10
10
  fal/flags.py,sha256=oWN_eidSUOcE9wdPK_77si3A1fpgOC0UEERPsvNLIMc,842
11
11
  fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
13
- fal/sdk.py,sha256=_1aK9VSzHPoDPbLm3nbhE4213zI66qAsgYs1Y1Wc3J8,20077
13
+ fal/sdk.py,sha256=wA58DYnSK1vdsBi8Or9Z8kvMMEyBNfeZYk_xulSfTWE,20078
14
14
  fal/sync.py,sha256=ZuIJA2-hTPNANG9B_NNJZUsO68EIdTH0dc9MzeVE2VU,4340
15
- fal/utils.py,sha256=MFDs-eO3rBgc3jqIwBpfBtvvK5tbzAYWMzHV-tTVLic,1754
15
+ fal/utils.py,sha256=pstF7-13xjB1gKOtzz4tIXc8b8nMSDd9HO79WCiVrt4,1753
16
16
  fal/workflows.py,sha256=jx3tGy2R7cN6lLvOzT6lhhlcjmiq64iZls2smVrmQj0,14657
17
17
  fal/auth/__init__.py,sha256=r8iA2-5ih7-Fik3gEC4HEWNFbGoxpYnXpZu1icPIoS0,3561
18
18
  fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
19
19
  fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
20
20
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
21
- fal/cli/apps.py,sha256=Dqcx7ewUNY6dh0bYqRlOCHVDzmkdpFxe9CNThEz7HX4,8144
21
+ fal/cli/apps.py,sha256=GlQSEE68HYfnhK90WIiOx611tcVkkbc9bu_10FMaFLY,8143
22
22
  fal/cli/auth.py,sha256=--MhfHGwxmtHbRkGioyn1prKn_U-pBzbz0G_QeZou-U,1352
23
- fal/cli/debug.py,sha256=1doDNwoaPDfLQginGNBxpC20dZYs5UxIojflDvV1Q04,1342
24
- fal/cli/deploy.py,sha256=yx7QDv4PTrqLCUODgK3glMRs58of9nlCM1_a_GYaZBk,4783
23
+ fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
24
+ fal/cli/deploy.py,sha256=jA-C4Pvzie70MVDnaFKc6ByfBrNFeaMROAKX98RD8tQ,4785
25
25
  fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
26
- fal/cli/keys.py,sha256=-9N6ZY6rW-_IE9tpupgaBPDGjGdKB3HKqU2g9daM3Xc,3109
26
+ fal/cli/keys.py,sha256=trDpA3LJu9S27qE_K8Hr6fKLK4vwVzbxUHq8TFrV4pw,3157
27
27
  fal/cli/main.py,sha256=MxETDhqIT37quMbmofSMxBcAFOhnEHjpQ_pYEtOhApM,1993
28
28
  fal/cli/parser.py,sha256=r1hd5e8Jq6yzDZw8-S0On1EjJbjRtHMuVuHC6MlvUj4,2835
29
- fal/cli/run.py,sha256=NXwzkAWCKrRwgoMLsBOgW7RJPJW4IgSTrG85q2iePyk,894
30
- fal/cli/secrets.py,sha256=mgHp3gBr8d2su7wBApeADKWHPkYu2ueB6gG3eNMETh8,2595
29
+ fal/cli/run.py,sha256=enhnpqo07PzGK2uh8M522zenNWxrBFOqb3oMZ8XiWdg,870
30
+ fal/cli/secrets.py,sha256=740msFm7d41HruudlcfqUXlFl53N-WmChsQP9B9M9Po,2572
31
31
  fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
32
32
  fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
33
33
  fal/console/ux.py,sha256=KMQs3UHQvVHDxDQQqlot-WskVKoMQXOE3jiVkkfmIMY,356
34
34
  fal/exceptions/__init__.py,sha256=x3fp97qMr5zCQJghMq6k2ESXWSrkWumO1BZebh3pWsI,92
35
- fal/exceptions/_base.py,sha256=U3n_4OtUx5MvfT2eol_a-N0dV9_eYFMvdbrhP-b_NXg,160
35
+ fal/exceptions/_base.py,sha256=oF2XfitbiDGObmSF1IX50uAdV8IUvOfR-YsGmMQSE0A,161
36
36
  fal/exceptions/auth.py,sha256=gxRago5coI__vSIcdcsqhhq1lRPkvCnwPAueIaXTAdw,329
37
37
  fal/logging/__init__.py,sha256=snqprf7-sKw6oAATS_Yxklf-a3XhLg0vIHICPwLp6TM,1583
38
- fal/logging/isolate.py,sha256=Gj_xylXc0ulGIyozLwTWisIclP7-du4tvhJWyPilrgo,1742
38
+ fal/logging/isolate.py,sha256=uKZpF5p02jqaiyXNYt7VUp43ShdKc_N4UUi7z65nmRc,1741
39
39
  fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
40
40
  fal/logging/trace.py,sha256=OhzB6d4rQZimBc18WFLqH_9BGfqFFumKKTAGSsmWRMg,1904
41
41
  fal/logging/user.py,sha256=0Xvb8n6tSb9l_V51VDzv6SOdYEFNouV_6nF_W9e7uNQ,642
@@ -43,13 +43,13 @@ fal/toolkit/__init__.py,sha256=sV95wiUzKoiDqF9vDgq4q-BLa2sD6IpuKSqp5kdTQNE,658
43
43
  fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
44
44
  fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
45
45
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
46
- fal/toolkit/file/file.py,sha256=r8PzNCgv8Gkj6s1zM0yW-pcMKIouyaiEH06iBue8MwM,6066
47
- fal/toolkit/file/types.py,sha256=9CqDh8SmNJNzfsrvtj468uo2SprJH9rOk8KMhhfU73c,1050
48
- fal/toolkit/file/providers/fal.py,sha256=ACxkfQ9kmMJ1xP8dNUHzkLkJJLZvoybTpVt8avGb8Nw,3747
49
- fal/toolkit/file/providers/gcp.py,sha256=7Lg7BXoHKkFu0jkGv3_vKh2Ks6eRfDMbw31N3mvDUtk,1913
50
- fal/toolkit/file/providers/r2.py,sha256=YW5aJBOX41MQxfx1rA_f-IiJhAPMZ5md0cxBcg3y08I,2537
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
51
  fal/toolkit/image/__init__.py,sha256=qNLyXsBWysionUjbeWbohLqWlw3G_UpzunamkZd_JLQ,71
52
- fal/toolkit/image/image.py,sha256=2q1ZCBSSdmDx9q1S4ahoCOniNaRcfSFnCS31f3b8ZZ0,4252
52
+ fal/toolkit/image/image.py,sha256=UDIHgkxae8LzmCvWBM9GayMnK8c0JMMfsrVlLnW5rto,4234
53
53
  fal/toolkit/utils/__init__.py,sha256=CrmM9DyCz5-SmcTzRSm5RaLgxy3kf0ZsSEN9uhnX2Xo,97
54
54
  fal/toolkit/utils/download_utils.py,sha256=fDUITgdGW0wRXLE0NuQg29YJnJS3yr6l0zbRKqX6zMU,17006
55
55
  openapi_fal_rest/__init__.py,sha256=ziculmF_i6trw63LzZGFX-6W3Lwq9mCR8_UpkpvpaHI,152
@@ -115,8 +115,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
115
115
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
116
116
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
117
117
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
118
- fal-1.1.0.dist-info/METADATA,sha256=OvMciwRk4COCWrBAjdUkaM5b7vJqdUzbR1RYHJ7yn6A,3777
119
- fal-1.1.0.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
120
- fal-1.1.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
121
- fal-1.1.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
122
- fal-1.1.0.dist-info/RECORD,,
118
+ fal-1.2.0.dist-info/METADATA,sha256=sfrRbze0jlBv3qqW-eG6sDFb6L6G7zHfJ9UpivA--uY,3777
119
+ fal-1.2.0.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
120
+ fal-1.2.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
121
+ fal-1.2.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
122
+ fal-1.2.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (70.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5