fal 1.5.6__py3-none-any.whl → 1.5.8__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.5.6'
16
- __version_tuple__ = version_tuple = (1, 5, 6)
15
+ __version__ = version = '1.5.8'
16
+ __version_tuple__ = version_tuple = (1, 5, 8)
fal/api.py CHANGED
@@ -171,6 +171,7 @@ class Host(Generic[ArgsT, ReturnT]):
171
171
  application_name: str | None = None,
172
172
  application_auth_mode: Literal["public", "shared", "private"] | None = None,
173
173
  metadata: dict[str, Any] | None = None,
174
+ scale: bool = True,
174
175
  ) -> str | None:
175
176
  """Register the given function on the host for API call execution."""
176
177
  raise NotImplementedError
@@ -430,6 +431,7 @@ class FalServerlessHost(Host):
430
431
  application_auth_mode: Literal["public", "shared", "private"] | None = None,
431
432
  metadata: dict[str, Any] | None = None,
432
433
  deployment_strategy: Literal["recreate", "rolling"] = "recreate",
434
+ scale: bool = True,
433
435
  ) -> str | None:
434
436
  environment_options = options.environment.copy()
435
437
  environment_options.setdefault("python_version", active_python())
@@ -439,15 +441,14 @@ class FalServerlessHost(Host):
439
441
  "machine_type", FAL_SERVERLESS_DEFAULT_MACHINE_TYPE
440
442
  )
441
443
  keep_alive = options.host.get("keep_alive", FAL_SERVERLESS_DEFAULT_KEEP_ALIVE)
442
- max_concurrency = options.host.get("max_concurrency")
443
- min_concurrency = options.host.get("min_concurrency")
444
- max_multiplexing = options.host.get("max_multiplexing")
445
444
  base_image = options.host.get("_base_image", None)
446
445
  scheduler = options.host.get("_scheduler", None)
447
446
  scheduler_options = options.host.get("_scheduler_options", None)
447
+ max_concurrency = options.host.get("max_concurrency")
448
+ min_concurrency = options.host.get("min_concurrency")
449
+ max_multiplexing = options.host.get("max_multiplexing")
448
450
  exposed_port = options.get_exposed_port()
449
451
  request_timeout = options.host.get("request_timeout")
450
-
451
452
  machine_requirements = MachineRequirements(
452
453
  machine_types=machine_type, # type: ignore
453
454
  num_gpus=options.host.get("num_gpus"),
@@ -486,6 +487,7 @@ class FalServerlessHost(Host):
486
487
  machine_requirements=machine_requirements,
487
488
  metadata=metadata,
488
489
  deployment_strategy=deployment_strategy,
490
+ scale=scale,
489
491
  ):
490
492
  for log in partial_result.logs:
491
493
  self._log_printer.print(log)
fal/cli/apps.py CHANGED
@@ -221,7 +221,7 @@ def _runners(args):
221
221
  str(runner.in_flight_requests),
222
222
  (
223
223
  "N/A (active)"
224
- if not runner.expiration_countdown
224
+ if runner.expiration_countdown is None
225
225
  else f"{runner.expiration_countdown}s"
226
226
  ),
227
227
  f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
fal/cli/deploy.py CHANGED
@@ -106,6 +106,7 @@ def _deploy_from_reference(
106
106
  application_auth_mode=app_auth,
107
107
  metadata=isolated_function.options.host.get("metadata", {}),
108
108
  deployment_strategy=deployment_strategy,
109
+ scale=not args.no_scale,
109
110
  )
110
111
 
111
112
  if app_id:
@@ -219,5 +220,14 @@ def add_parser(main_subparsers, parents):
219
220
  help="Deployment strategy.",
220
221
  default="recreate",
221
222
  )
223
+ parser.add_argument(
224
+ "--no-scale",
225
+ action="store_true",
226
+ help=(
227
+ "Use min_concurrency/max_concurrency/max_multiplexing from previous "
228
+ "deployment of application with this name, if exists. Otherwise will "
229
+ "use the values from the application code."
230
+ ),
231
+ )
222
232
 
223
233
  parser.set_defaults(func=_deploy)
fal/sdk.py CHANGED
@@ -5,7 +5,7 @@ from contextlib import ExitStack
5
5
  from dataclasses import dataclass, field
6
6
  from datetime import datetime, timedelta
7
7
  from enum import Enum
8
- from typing import Any, Callable, Generic, Iterator, Literal, TypeVar
8
+ from typing import Any, Callable, Generic, Iterator, Literal, Optional, TypeVar
9
9
 
10
10
  import grpc
11
11
  import isolate_proto
@@ -214,7 +214,7 @@ class AliasInfo:
214
214
  class RunnerInfo:
215
215
  runner_id: str
216
216
  in_flight_requests: int
217
- expiration_countdown: int
217
+ expiration_countdown: Optional[int]
218
218
  uptime: timedelta
219
219
 
220
220
 
@@ -344,7 +344,9 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
344
344
  return RunnerInfo(
345
345
  runner_id=message.runner_id,
346
346
  in_flight_requests=message.in_flight_requests,
347
- expiration_countdown=message.expiration_countdown,
347
+ expiration_countdown=message.expiration_countdown
348
+ if message.HasField("expiration_countdown")
349
+ else None,
348
350
  uptime=timedelta(seconds=message.uptime),
349
351
  )
350
352
 
@@ -497,6 +499,7 @@ class FalServerlessConnection:
497
499
  machine_requirements: MachineRequirements | None = None,
498
500
  metadata: dict[str, Any] | None = None,
499
501
  deployment_strategy: Literal["recreate", "rolling"] = "recreate",
502
+ scale: bool = True,
500
503
  ) -> Iterator[isolate_proto.RegisterApplicationResult]:
501
504
  wrapped_function = to_serialized_object(function, serialization_method)
502
505
  if machine_requirements:
@@ -544,6 +547,7 @@ class FalServerlessConnection:
544
547
  auth_mode=auth_mode,
545
548
  metadata=struct_metadata,
546
549
  deployment_strategy=deployment_strategy_proto,
550
+ scale=scale,
547
551
  )
548
552
  for partial_result in self.stub.RegisterApplication(request):
549
553
  yield from_grpc(partial_result)
fal/toolkit/file/file.py CHANGED
@@ -135,6 +135,8 @@ class File(BaseModel):
135
135
  FileRepository | RepositoryId
136
136
  ] = FALLBACK_REPOSITORY,
137
137
  request: Optional[Request] = None,
138
+ save_kwargs: Optional[dict] = None,
139
+ fallback_save_kwargs: Optional[dict] = None,
138
140
  ) -> File:
139
141
  repo = (
140
142
  repository
@@ -142,12 +144,15 @@ class File(BaseModel):
142
144
  else get_builtin_repository(repository)
143
145
  )
144
146
 
147
+ save_kwargs = save_kwargs or {}
148
+ fallback_save_kwargs = fallback_save_kwargs or {}
149
+
145
150
  fdata = FileData(data, content_type, file_name)
146
151
 
147
152
  object_lifecycle_preference = get_lifecycle_preference(request)
148
153
 
149
154
  try:
150
- url = repo.save(fdata, object_lifecycle_preference)
155
+ url = repo.save(fdata, object_lifecycle_preference, **save_kwargs)
151
156
  except Exception:
152
157
  if not fallback_repository:
153
158
  raise
@@ -158,7 +163,9 @@ class File(BaseModel):
158
163
  else get_builtin_repository(fallback_repository)
159
164
  )
160
165
 
161
- url = fallback_repo.save(fdata, object_lifecycle_preference)
166
+ url = fallback_repo.save(
167
+ fdata, object_lifecycle_preference, **fallback_save_kwargs
168
+ )
162
169
 
163
170
  return cls(
164
171
  url=url,
@@ -179,6 +186,8 @@ class File(BaseModel):
179
186
  FileRepository | RepositoryId
180
187
  ] = FALLBACK_REPOSITORY,
181
188
  request: Optional[Request] = None,
189
+ save_kwargs: Optional[dict] = None,
190
+ fallback_save_kwargs: Optional[dict] = None,
182
191
  ) -> File:
183
192
  file_path = Path(path)
184
193
  if not file_path.exists():
@@ -190,6 +199,9 @@ class File(BaseModel):
190
199
  else get_builtin_repository(repository)
191
200
  )
192
201
 
202
+ save_kwargs = save_kwargs or {}
203
+ fallback_save_kwargs = fallback_save_kwargs or {}
204
+
193
205
  content_type = content_type or "application/octet-stream"
194
206
  object_lifecycle_preference = get_lifecycle_preference(request)
195
207
 
@@ -199,6 +211,7 @@ class File(BaseModel):
199
211
  content_type=content_type,
200
212
  multipart=multipart,
201
213
  object_lifecycle_preference=object_lifecycle_preference,
214
+ **save_kwargs,
202
215
  )
203
216
  except Exception:
204
217
  if not fallback_repository:
@@ -215,6 +228,7 @@ class File(BaseModel):
215
228
  content_type=content_type,
216
229
  multipart=multipart,
217
230
  object_lifecycle_preference=object_lifecycle_preference,
231
+ **fallback_save_kwargs,
218
232
  )
219
233
 
220
234
  return cls(
@@ -0,0 +1,80 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import posixpath
5
+ import uuid
6
+ from dataclasses import dataclass
7
+ from io import BytesIO
8
+ from typing import Optional
9
+
10
+ from fal.toolkit.file.types import FileData, FileRepository
11
+ from fal.toolkit.utils.retry import retry
12
+
13
+ DEFAULT_URL_TIMEOUT = 60 * 15 # 15 minutes
14
+
15
+
16
+ @dataclass
17
+ class S3Repository(FileRepository):
18
+ bucket_name: str = "fal_file_storage"
19
+ url_expiration: int = DEFAULT_URL_TIMEOUT
20
+ aws_access_key_id: str | None = None
21
+ aws_secret_access_key: str | None = None
22
+
23
+ _s3_client = None
24
+
25
+ def __post_init__(self):
26
+ try:
27
+ import boto3
28
+ from botocore.client import Config
29
+ except ImportError:
30
+ raise Exception("boto3 is not installed")
31
+
32
+ if self.aws_access_key_id is None:
33
+ self.aws_access_key_id = os.environ.get("AWS_ACCESS_KEY_ID")
34
+ if self.aws_access_key_id is None:
35
+ raise Exception("AWS_ACCESS_KEY_ID environment variable is not set")
36
+
37
+ if self.aws_secret_access_key is None:
38
+ self.aws_secret_access_key = os.environ.get("AWS_SECRET_ACCESS_KEY")
39
+ if self.aws_secret_access_key is None:
40
+ raise Exception("AWS_SECRET_ACCESS_KEY environment variable is not set")
41
+
42
+ self._s3_client = boto3.client(
43
+ "s3",
44
+ aws_access_key_id=self.aws_access_key_id,
45
+ aws_secret_access_key=self.aws_secret_access_key,
46
+ config=Config(signature_version="s3v4"),
47
+ )
48
+
49
+ @property
50
+ def storage_client(self):
51
+ if self._s3_client is None:
52
+ raise Exception("S3 client is not initialized")
53
+
54
+ return self._s3_client
55
+
56
+ @retry(max_retries=3, base_delay=1, backoff_type="exponential", jitter=True)
57
+ def save(
58
+ self,
59
+ data: FileData,
60
+ object_lifecycle_preference: Optional[dict[str, str]] = None,
61
+ key: Optional[str] = None,
62
+ ) -> str:
63
+ destination_path = posixpath.join(
64
+ key or "",
65
+ f"{uuid.uuid4().hex}_{data.file_name}",
66
+ )
67
+
68
+ self.storage_client.upload_fileobj(
69
+ BytesIO(data.data),
70
+ self.bucket_name,
71
+ destination_path,
72
+ ExtraArgs={"ContentType": data.content_type},
73
+ )
74
+
75
+ public_url = self.storage_client.generate_presigned_url(
76
+ ClientMethod="get_object",
77
+ Params={"Bucket": self.bucket_name, "Key": destination_path},
78
+ ExpiresIn=self.url_expiration,
79
+ )
80
+ return public_url
@@ -1,8 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import urllib.request
3
4
  from functools import lru_cache
4
5
  from typing import TYPE_CHECKING
5
- from urllib.request import Request, urlopen
6
6
 
7
7
  from .image import * # noqa: F403
8
8
 
@@ -62,8 +62,8 @@ def read_image_from_url(
62
62
  }
63
63
 
64
64
  try:
65
- request = Request(url, headers=TEMP_HEADERS)
66
- response = urlopen(request)
65
+ request = urllib.request.Request(url, headers=TEMP_HEADERS)
66
+ response = urllib.request.urlopen(request)
67
67
  image_pil = Image.open(response)
68
68
  except Exception:
69
69
  import traceback
@@ -84,6 +84,9 @@ def _get_remote_file_properties(
84
84
  url_path = parsed_url.path
85
85
  file_name = Path(url_path).name or _hash_url(url)
86
86
 
87
+ # file name can still contain a forward slash if the server returns a relative path
88
+ file_name = Path(file_name).name
89
+
87
90
  return file_name, content_length
88
91
 
89
92
 
@@ -159,6 +162,7 @@ def download_file(
159
162
  try:
160
163
  file_name = _get_remote_file_properties(url, request_headers)[0]
161
164
  except Exception as e:
165
+ print(f"GOt error: {e}")
162
166
  raise DownloadError(f"Failed to get remote file properties for {url}") from e
163
167
 
164
168
  if "/" in file_name:
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.5.6
3
+ Version: 1.5.8
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
8
  Requires-Dist: isolate[build]<1.14.0,>=0.13.0
9
- Requires-Dist: isolate-proto==0.5.4
9
+ Requires-Dist: isolate-proto==0.5.5
10
10
  Requires-Dist: grpcio==1.64.0
11
11
  Requires-Dist: dill==0.3.7
12
12
  Requires-Dist: cloudpickle==3.0.0
@@ -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=k4Tk-oOp5Zst-Tqem-_IuwoAZtyDq4hHYWlF7LJTgBo,411
3
+ fal/_fal_version.py,sha256=bpyG2JPTJKDi28Mtx907aomd5KtqHfk_t3lAAZFZAGk,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=oiPONakWiK8KQHaUr41yBIG64FlC9UryFNXFiITVtXk,43295
6
+ fal/api.py,sha256=xTtPvDqaEHsq2lFsMwRZiHb4hzjVY3y6lV-xbzkSetI,43375
7
7
  fal/app.py,sha256=pkOTw-69nY6U9PaFtvz4sFjMyyZXIziM9mepzkx-NBo,21298
8
8
  fal/apps.py,sha256=lge7-HITzI20l1oXdlkAzqxdMVtXRfnACIylKRWgCNQ,7151
9
9
  fal/container.py,sha256=V7riyyq8AZGwEX9QaqRQDZyDN_bUKeRKV1OOZArXjL0,622
@@ -11,7 +11,7 @@ fal/files.py,sha256=QgfYfMKmNobMPufrAP_ga1FKcIAlSbw18Iar1-0qepo,2650
11
11
  fal/flags.py,sha256=oWN_eidSUOcE9wdPK_77si3A1fpgOC0UEERPsvNLIMc,842
12
12
  fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
14
- fal/sdk.py,sha256=-I-vjO-PuvtnZedFLKys8FpQVsRwEzTPD6heRYPQCE4,22260
14
+ fal/sdk.py,sha256=HAkOv0q53h4LPBdvjJHu_FST0Iq-SYzNKhx1qeKJZfs,22403
15
15
  fal/sync.py,sha256=ZuIJA2-hTPNANG9B_NNJZUsO68EIdTH0dc9MzeVE2VU,4340
16
16
  fal/utils.py,sha256=9q_QrQBlQN3nZYA1kEGRfhJWi4RjnO4H1uQswfaei9w,2146
17
17
  fal/workflows.py,sha256=jx3tGy2R7cN6lLvOzT6lhhlcjmiq64iZls2smVrmQj0,14657
@@ -20,11 +20,11 @@ fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
20
20
  fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
21
21
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
22
22
  fal/cli/_utils.py,sha256=u__PSeNxSC_4Psi3ZwLjefgNQVkYRpVH--vmwK7ppro,1187
23
- fal/cli/apps.py,sha256=-DDp-Gvxz5kHho5YjAhbri8vOny_9cftAI_wP2KR5nU,8175
23
+ fal/cli/apps.py,sha256=Fo4iUpd6FGTUcIp22WcssE1CaEn_BLKzK_E4JPsXhVI,8179
24
24
  fal/cli/auth.py,sha256=--MhfHGwxmtHbRkGioyn1prKn_U-pBzbz0G_QeZou-U,1352
25
25
  fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
26
26
  fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
27
- fal/cli/deploy.py,sha256=uAMBMXpv3kYNJ3zeIWBL6xf83NpxvvPKOjeE95dOG5o,7099
27
+ fal/cli/deploy.py,sha256=ZBM4pLDDj9ZntlSoFvK_-ZGO-lAOHoZFkYXS-OAxXT0,7461
28
28
  fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
29
29
  fal/cli/keys.py,sha256=trDpA3LJu9S27qE_K8Hr6fKLK4vwVzbxUHq8TFrV4pw,3157
30
30
  fal/cli/main.py,sha256=_Wh_DQc02qwh-ZN7v41lZm0lDR1WseViXVOcqUlyWLg,2009
@@ -47,12 +47,13 @@ fal/toolkit/__init__.py,sha256=sV95wiUzKoiDqF9vDgq4q-BLa2sD6IpuKSqp5kdTQNE,658
47
47
  fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
48
48
  fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
49
49
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
50
- fal/toolkit/file/file.py,sha256=4kOPfNVCpJJtDcvScgPzoSrMvkt8AMANNPa8S3Ofs-4,8910
50
+ fal/toolkit/file/file.py,sha256=tq-zMoNLJ1NJc9g8_RTnoIZABnRhtTtQchyMULimMTY,9442
51
51
  fal/toolkit/file/types.py,sha256=MjZ6xAhKPv4rowLo2Vcbho0sX7AQ3lm3KFyYDcw0dL4,1845
52
52
  fal/toolkit/file/providers/fal.py,sha256=V93vQbbFevPPpPSGfgkWuaBCYZnSxjtK50Lhk-zQYi8,21016
53
53
  fal/toolkit/file/providers/gcp.py,sha256=iQtkoYUqbmKKpC5srVOYtrruZ3reGRm5lz4kM8bshgk,2247
54
54
  fal/toolkit/file/providers/r2.py,sha256=G2OHcCH2yWrVtXT4hWHEXUeEjFhbKO0koqHcd7hkczk,2871
55
- fal/toolkit/image/__init__.py,sha256=aLcU8HzD7HyOxx-C-Bbx9kYCMHdBhy9tR98FSVJ6gSA,1830
55
+ fal/toolkit/file/providers/s3.py,sha256=CfiA6rTBFfP-empp0cB9OW2c9F5iy0Z-kGwCs5HBICU,2524
56
+ fal/toolkit/image/__init__.py,sha256=m3OatPbBhcEOYyaTu_dgToxunUKoJu4bJVCWUoN7HX4,1838
56
57
  fal/toolkit/image/image.py,sha256=ZSkozciP4XxaGnvrR_mP4utqE3_QhoPN0dau9FJ2Xco,5033
57
58
  fal/toolkit/image/safety_checker.py,sha256=S7ow-HuoVxC6ixHWWcBrAUm2dIlgq3sTAIull6xIbAg,3105
58
59
  fal/toolkit/image/nsfw_filter/__init__.py,sha256=0d9D51EhcnJg8cZLYJjgvQJDZT74CfQu6mpvinRYRpA,216
@@ -61,7 +62,7 @@ fal/toolkit/image/nsfw_filter/inference.py,sha256=BhIPF_zxRLetThQYxDDF0sdx9VRwvu
61
62
  fal/toolkit/image/nsfw_filter/model.py,sha256=63mu8D15z_IosoRUagRLGHy6VbLqFmrG-yZqnu2vVm4,457
62
63
  fal/toolkit/image/nsfw_filter/requirements.txt,sha256=3Pmrd0Ny6QAeBqUNHCgffRyfaCARAPJcfSCX5cRYpbM,37
63
64
  fal/toolkit/utils/__init__.py,sha256=CrmM9DyCz5-SmcTzRSm5RaLgxy3kf0ZsSEN9uhnX2Xo,97
64
- fal/toolkit/utils/download_utils.py,sha256=9WMpn0mFIhkFelQpPj5KG-pC7RMyyOzGHbNRDSyz07o,17664
65
+ fal/toolkit/utils/download_utils.py,sha256=fFrKoSJPBSurrD636ncNHhJv-cS3zReIv6ltiU3tMZU,17823
65
66
  fal/toolkit/utils/retry.py,sha256=qyIf86LMNf9L-Xgqbjl6vf-CZmhmeDQ6Y9I4LWkU6lk,1289
66
67
  openapi_fal_rest/__init__.py,sha256=ziculmF_i6trw63LzZGFX-6W3Lwq9mCR8_UpkpvpaHI,152
67
68
  openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
@@ -126,8 +127,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
126
127
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
127
128
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
128
129
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
129
- fal-1.5.6.dist-info/METADATA,sha256=NFDQ6lqj1Fnq-g1AmKCf5PX47qwnNso0hjdaG-EUD3w,3989
130
- fal-1.5.6.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
131
- fal-1.5.6.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
132
- fal-1.5.6.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
133
- fal-1.5.6.dist-info/RECORD,,
130
+ fal-1.5.8.dist-info/METADATA,sha256=gq5HYuUN_Jf7OxSshH7gNBr9OhdBp4kZwtRsWj1cy78,3989
131
+ fal-1.5.8.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
132
+ fal-1.5.8.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
133
+ fal-1.5.8.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
134
+ fal-1.5.8.dist-info/RECORD,,
File without changes