fal 1.4.0__py3-none-any.whl → 1.5.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.4.0'
16
- __version_tuple__ = version_tuple = (1, 4, 0)
15
+ __version__ = version = '1.5.0'
16
+ __version_tuple__ = version_tuple = (1, 5, 0)
fal/api.py CHANGED
@@ -397,6 +397,7 @@ class FalServerlessHost(Host):
397
397
  "max_multiplexing",
398
398
  "setup_function",
399
399
  "metadata",
400
+ "request_timeout",
400
401
  "_base_image",
401
402
  "_scheduler",
402
403
  "_scheduler_options",
@@ -444,6 +445,7 @@ class FalServerlessHost(Host):
444
445
  scheduler = options.host.get("_scheduler", None)
445
446
  scheduler_options = options.host.get("_scheduler_options", None)
446
447
  exposed_port = options.get_exposed_port()
448
+ request_timeout = options.host.get("request_timeout")
447
449
 
448
450
  machine_requirements = MachineRequirements(
449
451
  machine_types=machine_type, # type: ignore
@@ -456,6 +458,7 @@ class FalServerlessHost(Host):
456
458
  max_multiplexing=max_multiplexing,
457
459
  max_concurrency=max_concurrency,
458
460
  min_concurrency=min_concurrency,
461
+ request_timeout=request_timeout,
459
462
  )
460
463
 
461
464
  partial_func = _prepare_partial_func(func)
@@ -516,6 +519,7 @@ class FalServerlessHost(Host):
516
519
  scheduler_options = options.host.get("_scheduler_options", None)
517
520
  exposed_port = options.get_exposed_port()
518
521
  setup_function = options.host.get("setup_function", None)
522
+ request_timeout = options.host.get("request_timeout")
519
523
 
520
524
  machine_requirements = MachineRequirements(
521
525
  machine_types=machine_type, # type: ignore
@@ -528,6 +532,7 @@ class FalServerlessHost(Host):
528
532
  max_multiplexing=max_multiplexing,
529
533
  max_concurrency=max_concurrency,
530
534
  min_concurrency=min_concurrency,
535
+ request_timeout=request_timeout,
531
536
  )
532
537
 
533
538
  return_value = _UNSET
@@ -693,6 +698,7 @@ def function(
693
698
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
694
699
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
695
700
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
701
+ request_timeout: int | None = None,
696
702
  setup_function: Callable[..., None] | None = None,
697
703
  _base_image: str | None = None,
698
704
  _scheduler: str | None = None,
@@ -719,6 +725,7 @@ def function(
719
725
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
720
726
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
721
727
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
728
+ request_timeout: int | None = None,
722
729
  setup_function: Callable[..., None] | None = None,
723
730
  _base_image: str | None = None,
724
731
  _scheduler: str | None = None,
@@ -795,6 +802,7 @@ def function(
795
802
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
796
803
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
797
804
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
805
+ request_timeout: int | None = None,
798
806
  setup_function: Callable[..., None] | None = None,
799
807
  _base_image: str | None = None,
800
808
  _scheduler: str | None = None,
@@ -826,6 +834,7 @@ def function(
826
834
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
827
835
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
828
836
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
837
+ request_timeout: int | None = None,
829
838
  setup_function: Callable[..., None] | None = None,
830
839
  _base_image: str | None = None,
831
840
  _scheduler: str | None = None,
@@ -851,6 +860,7 @@ def function(
851
860
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
852
861
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
853
862
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
863
+ request_timeout: int | None = None,
854
864
  setup_function: Callable[..., None] | None = None,
855
865
  _base_image: str | None = None,
856
866
  _scheduler: str | None = None,
@@ -876,6 +886,7 @@ def function(
876
886
  keep_alive: int = FAL_SERVERLESS_DEFAULT_KEEP_ALIVE,
877
887
  max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING,
878
888
  min_concurrency: int = FAL_SERVERLESS_DEFAULT_MIN_CONCURRENCY,
889
+ request_timeout: int | None = None,
879
890
  setup_function: Callable[..., None] | None = None,
880
891
  _base_image: str | None = None,
881
892
  _scheduler: str | None = None,
fal/app.py CHANGED
@@ -189,11 +189,17 @@ class App(fal.api.BaseServable):
189
189
  }
190
190
  app_name: ClassVar[str]
191
191
  app_auth: ClassVar[Literal["private", "public", "shared"]] = "private"
192
+ version: ClassVar[str] = "unknown"
193
+ request_timeout: ClassVar[int | None] = None
192
194
 
193
195
  def __init_subclass__(cls, **kwargs):
194
196
  app_name = kwargs.pop("name", None) or _to_fal_app_name(cls.__name__)
195
197
  parent_settings = getattr(cls, "host_kwargs", {})
196
198
  cls.host_kwargs = {**parent_settings, **kwargs}
199
+
200
+ if cls.request_timeout is not None:
201
+ cls.host_kwargs["request_timeout"] = cls.request_timeout
202
+
197
203
  cls.app_name = getattr(cls, "app_name", app_name)
198
204
 
199
205
  if cls.__init__ is not App.__init__:
@@ -232,7 +238,7 @@ class App(fal.api.BaseServable):
232
238
  await _call_any_fn(self.teardown)
233
239
 
234
240
  def health(self):
235
- return {}
241
+ return {"version": self.version}
236
242
 
237
243
  def setup(self):
238
244
  """Setup the application before serving."""
fal/cli/_utils.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from fal.files import find_pyproject_toml, parse_pyproject_toml
3
+ from fal.files import find_project_root, find_pyproject_toml, parse_pyproject_toml
4
4
 
5
5
 
6
6
  def is_app_name(app_ref: tuple[str, str | None]) -> bool:
@@ -29,6 +29,11 @@ def get_app_data_from_toml(app_name):
29
29
  except KeyError:
30
30
  raise ValueError(f"App {app_name} does not have a ref key in pyproject.toml")
31
31
 
32
+ # Convert the app_ref to a path relative to the project root
33
+ project_root, _ = find_project_root(None)
34
+ app_ref = str(project_root / app_ref)
35
+
32
36
  app_auth = app_data.get("auth", "private")
37
+ app_deployment_strategy = app_data.get("deployment_strategy", "recreate")
33
38
 
34
- return app_ref, app_auth
39
+ return app_ref, app_auth, app_deployment_strategy
fal/cli/deploy.py CHANGED
@@ -65,8 +65,9 @@ def _get_user() -> User:
65
65
  def _deploy_from_reference(
66
66
  app_ref: Tuple[Optional[Union[Path, str]], ...],
67
67
  app_name: str,
68
- auth: Literal["public", "shared", "private"],
69
68
  args,
69
+ auth: Optional[Literal["public", "shared", "private"]] = None,
70
+ deployment_strategy: Optional[Literal["recreate", "rolling"]] = None,
70
71
  ):
71
72
  from fal.api import FalServerlessError, FalServerlessHost
72
73
  from fal.utils import load_function_from
@@ -96,7 +97,7 @@ def _deploy_from_reference(
96
97
  isolated_function = loaded.function
97
98
  app_name = app_name or loaded.app_name # type: ignore
98
99
  app_auth = auth or loaded.app_auth or "private"
99
- deployment_strategy = args.strategy or "recreate"
100
+ deployment_strategy = deployment_strategy or "recreate"
100
101
 
101
102
  app_id = host.register(
102
103
  func=isolated_function.func,
@@ -137,7 +138,7 @@ def _deploy(args):
137
138
  raise ValueError("Cannot use --app-name or --auth with app name reference.")
138
139
 
139
140
  app_name = args.app_ref[0]
140
- app_ref, app_auth = get_app_data_from_toml(app_name)
141
+ app_ref, app_auth, app_deployment_strategy = get_app_data_from_toml(app_name)
141
142
  file_path, func_name = RefAction.split_ref(app_ref)
142
143
 
143
144
  # path/to/myfile.py::MyApp
@@ -145,8 +146,15 @@ def _deploy(args):
145
146
  file_path, func_name = args.app_ref
146
147
  app_name = args.app_name
147
148
  app_auth = args.auth
148
-
149
- _deploy_from_reference((file_path, func_name), app_name, app_auth, args)
149
+ app_deployment_strategy = args.strategy
150
+
151
+ _deploy_from_reference(
152
+ (file_path, func_name),
153
+ app_name,
154
+ args,
155
+ app_auth,
156
+ app_deployment_strategy,
157
+ )
150
158
 
151
159
 
152
160
  def add_parser(main_subparsers, parents):
fal/cli/run.py CHANGED
@@ -10,7 +10,7 @@ def _run(args):
10
10
 
11
11
  if is_app_name(args.func_ref):
12
12
  app_name = args.func_ref[0]
13
- app_ref, _ = get_app_data_from_toml(app_name)
13
+ app_ref, _, _ = get_app_data_from_toml(app_name)
14
14
  file_path, func_name = RefAction.split_ref(app_ref)
15
15
  else:
16
16
  file_path, func_name = args.func_ref
fal/sdk.py CHANGED
@@ -399,6 +399,7 @@ class MachineRequirements:
399
399
  max_concurrency: int | None = None
400
400
  max_multiplexing: int | None = None
401
401
  min_concurrency: int | None = None
402
+ request_timeout: int | None = None
402
403
 
403
404
  def __post_init__(self):
404
405
  if isinstance(self.machine_types, str):
@@ -514,6 +515,7 @@ class FalServerlessConnection:
514
515
  max_concurrency=machine_requirements.max_concurrency,
515
516
  min_concurrency=machine_requirements.min_concurrency,
516
517
  max_multiplexing=machine_requirements.max_multiplexing,
518
+ request_timeout=machine_requirements.request_timeout,
517
519
  )
518
520
  else:
519
521
  wrapped_requirements = None
@@ -607,6 +609,7 @@ class FalServerlessConnection:
607
609
  max_concurrency=machine_requirements.max_concurrency,
608
610
  max_multiplexing=machine_requirements.max_multiplexing,
609
611
  min_concurrency=machine_requirements.min_concurrency,
612
+ request_timeout=machine_requirements.request_timeout,
610
613
  )
611
614
  else:
612
615
  wrapped_requirements = None
@@ -10,6 +10,7 @@ from dataclasses import dataclass
10
10
  from datetime import datetime, timezone
11
11
  from pathlib import Path
12
12
  from urllib.error import HTTPError
13
+ from urllib.parse import urlparse, urlunparse
13
14
  from urllib.request import Request, urlopen
14
15
 
15
16
  from fal.auth import key_credentials
@@ -24,7 +25,7 @@ _FAL_CDN = "https://fal.media"
24
25
  class FalV2Token:
25
26
  token: str
26
27
  token_type: str
27
- base_url: str
28
+ base_upload_url: str
28
29
  expires_at: datetime
29
30
 
30
31
  def is_expired(self) -> bool:
@@ -36,7 +37,7 @@ class FalV2TokenManager:
36
37
  self._token: FalV2Token = FalV2Token(
37
38
  token="",
38
39
  token_type="",
39
- base_url="",
40
+ base_upload_url="",
40
41
  expires_at=datetime.min.replace(tzinfo=timezone.utc),
41
42
  )
42
43
  self._lock: threading.Lock = threading.Lock()
@@ -72,10 +73,15 @@ class FalV2TokenManager:
72
73
  with urlopen(req) as response:
73
74
  result = json.load(response)
74
75
 
76
+ parsed_base_url = urlparse(result["base_url"])
77
+ base_upload_url = urlunparse(
78
+ parsed_base_url._replace(netloc="upload." + parsed_base_url.netloc)
79
+ )
80
+
75
81
  self._token = FalV2Token(
76
82
  token=result["token"],
77
83
  token_type=result["token_type"],
78
- base_url=result["base_url"],
84
+ base_upload_url=base_upload_url,
79
85
  expires_at=datetime.fromisoformat(result["expires_at"]),
80
86
  )
81
87
 
@@ -179,7 +185,7 @@ class MultipartUpload:
179
185
  token = fal_v2_token_manager.get_token()
180
186
  try:
181
187
  req = Request(
182
- f"{token.base_url}/upload/initiate-multipart",
188
+ f"{token.base_upload_url}/upload/initiate-multipart",
183
189
  method="POST",
184
190
  headers={
185
191
  "Authorization": f"{token.token_type} {token.token}",
@@ -195,7 +201,7 @@ class MultipartUpload:
195
201
  )
196
202
  with urlopen(req) as response:
197
203
  result = json.load(response)
198
- self._upload_id = result["upload_id"]
204
+ self._upload_url = result["upload_url"]
199
205
  self._file_url = result["file_url"]
200
206
  except HTTPError as exc:
201
207
  raise FileUploadException(
@@ -235,10 +241,7 @@ class MultipartUpload:
235
241
  ) as executor:
236
242
  futures = []
237
243
  for part_number in range(1, parts + 1):
238
- upload_url = (
239
- f"{self._file_url}?upload_id={self._upload_id}"
240
- f"&part_number={part_number}"
241
- )
244
+ upload_url = f"{self._upload_url}&part_number={part_number}"
242
245
  futures.append(
243
246
  executor.submit(self._upload_part, upload_url, part_number)
244
247
  )
@@ -248,7 +251,7 @@ class MultipartUpload:
248
251
  self._parts.append(entry)
249
252
 
250
253
  def complete(self):
251
- url = f"{self._file_url}?upload_id={self._upload_id}"
254
+ url = self._upload_url
252
255
  try:
253
256
  req = Request(
254
257
  url,
@@ -281,7 +284,7 @@ class FalFileRepositoryV2(FalFileRepositoryBase):
281
284
  "Content-Type": file.content_type,
282
285
  }
283
286
 
284
- storage_url = f"{token.base_url}/upload"
287
+ storage_url = f"{token.base_upload_url}/upload"
285
288
 
286
289
  try:
287
290
  req = Request(
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 1.4.0
3
+ Version: 1.5.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
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.3
9
+ Requires-Dist: isolate-proto==0.5.4
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,17 +1,17 @@
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=R8-T9fmURjcuoxYpHTAjyNAhgJPDtI2jogCjqYYkfCU,411
3
+ fal/_fal_version.py,sha256=OYzqgMEgfFG0au4hzbEdgYI-c7Hxo3wdBtrpEjK1RoY,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=EuHMoWJ-LUP46moTQCXoBlzXlXCfdb0YQR7zsM694jQ,42513
7
- fal/app.py,sha256=asJmz8gavn05s_gKXesosafw3F23zMuPUS50BX2HjI4,17712
6
+ fal/api.py,sha256=echMD8k9HxAKk1ShtnBsaNf87_K2JdrTB-Bd9V1bPys,42998
7
+ fal/app.py,sha256=OdF2y30i5gp7ZXPWW32Oinzq6nKCeHesvtHeRq7XWUw,17938
8
8
  fal/apps.py,sha256=lge7-HITzI20l1oXdlkAzqxdMVtXRfnACIylKRWgCNQ,7151
9
9
  fal/container.py,sha256=V7riyyq8AZGwEX9QaqRQDZyDN_bUKeRKV1OOZArXjL0,622
10
10
  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=Ve9X3WeoRBrAqP-HnJ7hdwmQzXYGU32wJMN3QPDw4yA,22081
14
+ fal/sdk.py,sha256=-I-vjO-PuvtnZedFLKys8FpQVsRwEzTPD6heRYPQCE4,22260
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
@@ -19,17 +19,17 @@ fal/auth/__init__.py,sha256=r8iA2-5ih7-Fik3gEC4HEWNFbGoxpYnXpZu1icPIoS0,3561
19
19
  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
- fal/cli/_utils.py,sha256=DSfHZ6qna4jLffs-N4F3XbV-9ydF_OSlP2-GRounWsY,911
22
+ fal/cli/_utils.py,sha256=u__PSeNxSC_4Psi3ZwLjefgNQVkYRpVH--vmwK7ppro,1187
23
23
  fal/cli/apps.py,sha256=-DDp-Gvxz5kHho5YjAhbri8vOny_9cftAI_wP2KR5nU,8175
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=8iVTpkQPvKHGHEaxZLnCTftRSC0MuZYC94Xf-qG27p0,6857
27
+ fal/cli/deploy.py,sha256=uAMBMXpv3kYNJ3zeIWBL6xf83NpxvvPKOjeE95dOG5o,7099
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
31
31
  fal/cli/parser.py,sha256=edCqFWYAQSOhrxeEK9BtFRlTEUAlG2JUDjS_vhZ_nHE,2868
32
- fal/cli/run.py,sha256=uscbLBfTe8-UAbqh8h1iWuGD_G9UNNrj3k8bF5rtzy4,1201
32
+ fal/cli/run.py,sha256=J1lSZ_wJIhrygSduMr0Wf2pQ8OUJlFbyH5KKUjxDF6w,1204
33
33
  fal/cli/secrets.py,sha256=740msFm7d41HruudlcfqUXlFl53N-WmChsQP9B9M9Po,2572
34
34
  fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
35
35
  fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
@@ -49,7 +49,7 @@ fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
49
49
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
50
50
  fal/toolkit/file/file.py,sha256=jGdaIHMoYRCwsui3q3J6RTnngBG1-53UeJa0k_bBO2M,7756
51
51
  fal/toolkit/file/types.py,sha256=GymH0CJesJvsZ6wph7GqTGTuNjzvyMgLxQmBBxoKzS0,1627
52
- fal/toolkit/file/providers/fal.py,sha256=4uIc-SdOo43kanirNBReXls8mbifxIcXLaZJQJ5UMcQ,12534
52
+ fal/toolkit/file/providers/fal.py,sha256=f07ps_P8qyYCeLA9fDnG46c7uIfDZOgbL7MD5LxTUQs,12677
53
53
  fal/toolkit/file/providers/gcp.py,sha256=cxG1j3yuOpFl_Dl_nCEibFE4677qkdXZhuKgb65PnjQ,2126
54
54
  fal/toolkit/file/providers/r2.py,sha256=Y3DjhpmrbESUTDUtVcKtg0NMKamMTevf6cJA7OgvalI,2750
55
55
  fal/toolkit/image/__init__.py,sha256=aLcU8HzD7HyOxx-C-Bbx9kYCMHdBhy9tR98FSVJ6gSA,1830
@@ -126,8 +126,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
126
126
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
127
127
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
128
128
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
129
- fal-1.4.0.dist-info/METADATA,sha256=ojpG29xyDDwvd7GB440xIkUa8AkeDhfy-IGQgpNKp3I,3787
130
- fal-1.4.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
131
- fal-1.4.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
132
- fal-1.4.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
133
- fal-1.4.0.dist-info/RECORD,,
129
+ fal-1.5.0.dist-info/METADATA,sha256=T1lxxWWwhCxUkj3PD7Bu7iZc75unccRLj__MMXyW184,3787
130
+ fal-1.5.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
131
+ fal-1.5.0.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
132
+ fal-1.5.0.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
133
+ fal-1.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5