fal 1.11.2__py3-none-any.whl → 1.11.4__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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.11.2'
21
- __version_tuple__ = version_tuple = (1, 11, 2)
20
+ __version__ = version = '1.11.4'
21
+ __version_tuple__ = version_tuple = (1, 11, 4)
fal/api.py CHANGED
@@ -1088,7 +1088,10 @@ class BaseServable:
1088
1088
  type(exc), exc, exc.__traceback__
1089
1089
  )
1090
1090
 
1091
- print(json.dumps({"traceback": "".join(formatted_exception[::-1])}))
1091
+ print(
1092
+ json.dumps({"traceback": "".join(formatted_exception[::-1])}),
1093
+ flush=True,
1094
+ )
1092
1095
 
1093
1096
  if _is_cuda_oom_exception(exc):
1094
1097
  return await cuda_out_of_memory_exception_handler(
fal/app.py CHANGED
@@ -268,7 +268,7 @@ class App(fal.api.BaseServable):
268
268
  "keep_alive": 60,
269
269
  }
270
270
  app_name: ClassVar[str]
271
- app_auth: ClassVar[Literal["private", "public", "shared"]] = "private"
271
+ app_auth: ClassVar[Literal["private", "public", "shared", None]] = None
272
272
  request_timeout: ClassVar[int | None] = None
273
273
  startup_timeout: ClassVar[int | None] = None
274
274
 
fal/auth/__init__.py CHANGED
@@ -5,12 +5,11 @@ from dataclasses import dataclass, field
5
5
  from threading import Lock
6
6
  from typing import Optional
7
7
 
8
- import click
9
-
10
8
  from fal.auth import auth0, local
11
9
  from fal.config import Config
12
10
  from fal.console import console
13
11
  from fal.console.icons import CHECK_ICON
12
+ from fal.exceptions import FalServerlessException
14
13
  from fal.exceptions.auth import UnauthenticatedException
15
14
 
16
15
 
@@ -85,7 +84,7 @@ def login():
85
84
  def logout():
86
85
  refresh_token, _ = local.load_token()
87
86
  if refresh_token is None:
88
- raise click.ClickException(message="You're not logged in")
87
+ raise FalServerlessException("You're not logged in")
89
88
  auth0.revoke(refresh_token)
90
89
  with local.lock_token():
91
90
  local.delete_token()
fal/auth/auth0.py CHANGED
@@ -4,12 +4,12 @@ import functools
4
4
  import time
5
5
  import warnings
6
6
 
7
- import click
8
7
  import httpx
9
8
 
10
9
  from fal.console import console
11
10
  from fal.console.icons import CHECK_ICON
12
11
  from fal.console.ux import maybe_open_browser_tab
12
+ from fal.exceptions import FalServerlessException
13
13
 
14
14
  WEBSITE_URL = "https://fal.ai"
15
15
 
@@ -55,7 +55,7 @@ def login() -> dict:
55
55
  )
56
56
 
57
57
  if device_code_response.status_code != 200:
58
- raise click.ClickException("Error generating the device code")
58
+ raise FalServerlessException("Error generating the device code")
59
59
 
60
60
  device_code_data = device_code_response.json()
61
61
  device_user_code = device_code_data["user_code"]
@@ -92,7 +92,7 @@ def login() -> dict:
92
92
 
93
93
  elif token_data["error"] not in ("authorization_pending", "slow_down"):
94
94
  status.update(spinner=None)
95
- raise click.ClickException(token_data["error_description"])
95
+ raise FalServerlessException(token_data["error_description"])
96
96
 
97
97
  else:
98
98
  time.sleep(device_code_data["interval"])
@@ -115,7 +115,7 @@ def refresh(token: str) -> dict:
115
115
 
116
116
  return token_data
117
117
  else:
118
- raise click.ClickException(token_data["error_description"])
118
+ raise FalServerlessException(token_data["error_description"])
119
119
 
120
120
 
121
121
  def revoke(token: str):
@@ -130,7 +130,7 @@ def revoke(token: str):
130
130
 
131
131
  if token_response.status_code != 200:
132
132
  token_data = token_response.json()
133
- raise click.ClickException(token_data["error_description"])
133
+ raise FalServerlessException(token_data["error_description"])
134
134
 
135
135
  _open_browser(logout_url(WEBSITE_URL), None)
136
136
 
@@ -142,7 +142,7 @@ def get_user_info(bearer_token: str) -> dict:
142
142
  )
143
143
 
144
144
  if userinfo_response.status_code != 200:
145
- raise click.ClickException(userinfo_response.content.decode("utf-8"))
145
+ raise FalServerlessException(userinfo_response.content.decode("utf-8"))
146
146
 
147
147
  return userinfo_response.json()
148
148
 
fal/cli/apps.py CHANGED
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ import fal.cli.runners as runners
6
+
5
7
  from ._utils import get_client
6
8
  from .parser import FalClientParser
7
9
 
@@ -268,59 +270,17 @@ def _add_set_rev_parser(subparsers, parents):
268
270
 
269
271
 
270
272
  def _runners(args):
271
- from rich.table import Table
272
-
273
273
  client = get_client(args.host, args.team)
274
274
  with client.connect() as connection:
275
- runners = connection.list_alias_runners(alias=args.app_name)
276
-
277
- table = Table()
278
- table.add_column("Runner ID")
279
- table.add_column("In Flight Requests")
280
- table.add_column("Missing Leases")
281
- table.add_column("Expires In")
282
- table.add_column("Uptime")
283
-
284
- for runner in runners:
285
- num_leases_with_request = len(
286
- [
287
- lease
288
- for lease in runner.external_metadata.get("leases", [])
289
- if lease.get("request_id") is not None
290
- ]
291
- )
292
-
293
- table.add_row(
294
- runner.runner_id,
295
- str(runner.in_flight_requests),
296
- str(runner.in_flight_requests - num_leases_with_request),
297
- (
298
- "N/A (active)"
299
- if runner.expiration_countdown is None
300
- else f"{runner.expiration_countdown}s"
301
- ),
302
- f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
303
- )
304
-
305
- args.console.print(f"Runners: {len(runners)}")
306
- args.console.print(table)
307
-
308
- requests_table = Table()
309
- requests_table.add_column("Runner ID")
310
- requests_table.add_column("Request ID")
311
- requests_table.add_column("Caller ID")
312
-
313
- for runner in runners:
314
- for lease in runner.external_metadata.get("leases", []):
315
- if not (req_id := lease.get("request_id")):
316
- continue
275
+ alias_runners = connection.list_alias_runners(alias=args.app_name)
317
276
 
318
- requests_table.add_row(
319
- runner.runner_id,
320
- req_id,
321
- lease.get("caller_user_id") or "",
322
- )
277
+ runners_table = runners.runners_table(alias_runners)
278
+ args.console.print(f"Runners: {len(alias_runners)}")
279
+ # Drop the alias column, which is the first column
280
+ runners_table.columns.pop(0)
281
+ args.console.print(runners_table)
323
282
 
283
+ requests_table = runners.runners_requests_table(alias_runners)
324
284
  args.console.print(f"Requests: {len(requests_table.rows)}")
325
285
  args.console.print(requests_table)
326
286
 
fal/cli/deploy.py CHANGED
@@ -97,7 +97,7 @@ def _deploy_from_reference(
97
97
  )
98
98
  isolated_function = loaded.function
99
99
  app_name = app_name or loaded.app_name # type: ignore
100
- app_auth = auth or loaded.app_auth or "private"
100
+ app_auth = auth or loaded.app_auth
101
101
  deployment_strategy = deployment_strategy or "recreate"
102
102
 
103
103
  app_id = host.register(
fal/cli/main.py CHANGED
@@ -2,7 +2,7 @@ import argparse
2
2
 
3
3
  import rich
4
4
 
5
- from fal import __version__
5
+ from fal._version import __version__
6
6
  from fal.console import console
7
7
  from fal.console.icons import CROSS_ICON
8
8
 
fal/cli/runners.py CHANGED
@@ -1,13 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List
4
+
5
+ from fal.sdk import RunnerInfo
6
+
1
7
  from ._utils import get_client
2
8
  from .parser import FalClientParser
3
9
 
4
10
 
11
+ def runners_table(runners: List[RunnerInfo]):
12
+ from rich.table import Table
13
+
14
+ table = Table()
15
+ table.add_column("Alias")
16
+ table.add_column("Runner ID")
17
+ table.add_column("In Flight Requests")
18
+ table.add_column("Missing Leases")
19
+ table.add_column("Expires In")
20
+ table.add_column("Uptime")
21
+ table.add_column("Revision")
22
+
23
+ for runner in runners:
24
+ num_leases_with_request = len(
25
+ [
26
+ lease
27
+ for lease in runner.external_metadata.get("leases", [])
28
+ if lease.get("request_id") is not None
29
+ ]
30
+ )
31
+
32
+ table.add_row(
33
+ runner.alias,
34
+ runner.runner_id,
35
+ str(runner.in_flight_requests),
36
+ str(runner.in_flight_requests - num_leases_with_request),
37
+ (
38
+ "N/A (active)"
39
+ if runner.expiration_countdown is None
40
+ else f"{runner.expiration_countdown}s"
41
+ ),
42
+ f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
43
+ runner.revision,
44
+ )
45
+
46
+ return table
47
+
48
+
49
+ def runners_requests_table(runners: list[RunnerInfo]):
50
+ from rich.table import Table
51
+
52
+ table = Table()
53
+ table.add_column("Runner ID")
54
+ table.add_column("Request ID")
55
+ table.add_column("Caller ID")
56
+
57
+ for runner in runners:
58
+ for lease in runner.external_metadata.get("leases", []):
59
+ if not (req_id := lease.get("request_id")):
60
+ continue
61
+
62
+ table.add_row(
63
+ runner.runner_id,
64
+ req_id,
65
+ lease.get("caller_user_id") or "",
66
+ )
67
+
68
+ return table
69
+
70
+
5
71
  def _kill(args):
6
72
  client = get_client(args.host, args.team)
7
73
  with client.connect() as connection:
8
74
  connection.kill_runner(args.id)
9
75
 
10
76
 
77
+ def _list(args):
78
+ client = get_client(args.host, args.team)
79
+ with client.connect() as connection:
80
+ runners = connection.list_runners()
81
+ args.console.print(f"Runners: {len(runners)}")
82
+ args.console.print(runners_table(runners))
83
+
84
+ requests_table = runners_requests_table(runners)
85
+ args.console.print(f"Requests: {len(requests_table.rows)}")
86
+ args.console.print(requests_table)
87
+
88
+
11
89
  def _add_kill_parser(subparsers, parents):
12
90
  kill_help = "Kill a runner."
13
91
  parser = subparsers.add_parser(
@@ -23,6 +101,17 @@ def _add_kill_parser(subparsers, parents):
23
101
  parser.set_defaults(func=_kill)
24
102
 
25
103
 
104
+ def _add_list_parser(subparsers, parents):
105
+ list_help = "List runners."
106
+ parser = subparsers.add_parser(
107
+ "list",
108
+ description=list_help,
109
+ help=list_help,
110
+ parents=parents,
111
+ )
112
+ parser.set_defaults(func=_list)
113
+
114
+
26
115
  def add_parser(main_subparsers, parents):
27
116
  runners_help = "Manage fal runners."
28
117
  parser = main_subparsers.add_parser(
@@ -41,3 +130,4 @@ def add_parser(main_subparsers, parents):
41
130
  )
42
131
 
43
132
  _add_kill_parser(subparsers, parents)
133
+ _add_list_parser(subparsers, parents)
fal/config.py CHANGED
@@ -72,7 +72,7 @@ class Config:
72
72
  if not self.profile:
73
73
  raise ValueError("No profile set.")
74
74
 
75
- del self._config[self.profile][key]
75
+ self._config.get(self.profile, {}).pop(key, None)
76
76
 
77
77
  def get_internal(self, key: str) -> Optional[str]:
78
78
  if SETTINGS_SECTION not in self._config:
fal/sdk.py CHANGED
@@ -246,6 +246,8 @@ class RunnerInfo:
246
246
  expiration_countdown: Optional[int]
247
247
  uptime: timedelta
248
248
  external_metadata: dict[str, Any]
249
+ revision: str
250
+ alias: str
249
251
 
250
252
 
251
253
  @dataclass
@@ -392,6 +394,8 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
392
394
  ),
393
395
  uptime=timedelta(seconds=message.uptime),
394
396
  external_metadata=external_metadata,
397
+ revision=message.revision,
398
+ alias=message.alias,
395
399
  )
396
400
 
397
401
 
@@ -571,11 +575,12 @@ class FalServerlessConnection:
571
575
  else:
572
576
  wrapped_requirements = None
573
577
 
578
+ auth_mode = None
574
579
  if application_auth_mode == "public":
575
580
  auth_mode = isolate_proto.ApplicationAuthMode.PUBLIC
576
581
  elif application_auth_mode == "shared":
577
582
  auth_mode = isolate_proto.ApplicationAuthMode.SHARED
578
- else:
583
+ elif application_auth_mode == "private":
579
584
  auth_mode = isolate_proto.ApplicationAuthMode.PRIVATE
580
585
 
581
586
  struct_metadata = None
@@ -750,3 +755,8 @@ class FalServerlessConnection:
750
755
  def kill_runner(self, runner_id: str) -> None:
751
756
  request = isolate_proto.KillRunnerRequest(runner_id=runner_id)
752
757
  self.stub.KillRunner(request)
758
+
759
+ def list_runners(self) -> list[RunnerInfo]:
760
+ request = isolate_proto.ListRunnersRequest()
761
+ response = self.stub.ListRunners(request)
762
+ return [from_grpc(runner) for runner in response.runners]
@@ -1,17 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fal
3
- Version: 1.11.2
3
+ Version: 1.11.4
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]<0.17.0,>=0.16.1
9
- Requires-Dist: isolate-proto<0.8.0,>=0.7.0
9
+ Requires-Dist: isolate-proto<0.8.0,>=0.7.2
10
10
  Requires-Dist: grpcio==1.64.0
11
11
  Requires-Dist: dill==0.3.7
12
12
  Requires-Dist: cloudpickle==3.0.0
13
13
  Requires-Dist: typing-extensions<5,>=4.7.1
14
- Requires-Dist: click<9,>=8.1.3
15
14
  Requires-Dist: structlog<23,>=22.3.0
16
15
  Requires-Dist: opentelemetry-api<2,>=1.15.0
17
16
  Requires-Dist: opentelemetry-sdk<2,>=1.15.0
@@ -22,7 +21,7 @@ Requires-Dist: rich<14,>=13.3.2
22
21
  Requires-Dist: rich_argparse
23
22
  Requires-Dist: packaging>=21.3
24
23
  Requires-Dist: pathspec<1,>=0.11.1
25
- Requires-Dist: pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<3
24
+ Requires-Dist: pydantic!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,<2.11
26
25
  Requires-Dist: structlog>=22.0
27
26
  Requires-Dist: fastapi<1,>=0.99.1
28
27
  Requires-Dist: starlette-exporter>=0.21.0
@@ -47,6 +46,7 @@ Provides-Extra: test
47
46
  Requires-Dist: pytest<8; extra == "test"
48
47
  Requires-Dist: pytest-asyncio; extra == "test"
49
48
  Requires-Dist: pytest-xdist; extra == "test"
49
+ Requires-Dist: pytest-timeout; extra == "test"
50
50
  Requires-Dist: flaky; extra == "test"
51
51
  Requires-Dist: boto3; extra == "test"
52
52
  Provides-Extra: dev
@@ -1,40 +1,40 @@
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=U5-HoUE2zTuerZ_jeB56PyGuex0oNVid4wSBeoHXcJA,513
3
+ fal/_fal_version.py,sha256=TUeigolISZ-BA7ESHl-mbj4rbvn8J7LyWqAsmBHjes8,513
4
4
  fal/_serialization.py,sha256=rD2YiSa8iuzCaZohZwN_MPEB-PpSKbWRDeaIDpTEjyY,7653
5
5
  fal/_version.py,sha256=EBGqrknaf1WygENX-H4fBefLvHryvJBBGtVJetaB0NY,266
6
- fal/api.py,sha256=jqmQfhRvZMYpWWvbTfARxjywP_72c314pnLPTb5dGwA,44755
7
- fal/app.py,sha256=3WhjRgJdJ2ajAeZ3IeFb20_Zm6EH19a_WIuDtanaMHE,23308
6
+ fal/api.py,sha256=aoA0-7JsO6dWhudzmDOidbPwxnJmIJaQWhGV1kqLCbw,44814
7
+ fal/app.py,sha256=YZBmQ45QbWCO7OmbNhlzM0AMI6STog3fMjdEtpkAS5g,23309
8
8
  fal/apps.py,sha256=RpmElElJnDYjsTRQOdNYiJwd74GEOGYA38L5O5GzNEg,11068
9
- fal/config.py,sha256=sERAcM-YBk1aF9-z-ZSwQqwgOc4AXJSkWCrDP5n7ktM,2582
9
+ fal/config.py,sha256=26IrSU5LYOGVSULrolAWe6oa7NE8Vk1DLI0-RwS2NIs,2596
10
10
  fal/container.py,sha256=PM7e1RloTCexZ64uAv7sa2RSZxPI-X8KcxkdaZqEfjw,1914
11
11
  fal/files.py,sha256=QgfYfMKmNobMPufrAP_ga1FKcIAlSbw18Iar1-0qepo,2650
12
12
  fal/flags.py,sha256=oWN_eidSUOcE9wdPK_77si3A1fpgOC0UEERPsvNLIMc,842
13
13
  fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
15
- fal/sdk.py,sha256=WuYeZREYHElNZJLXyOh-sVj_9nX1E9QQ8lQPG6PIlsA,25045
15
+ fal/sdk.py,sha256=b-1J3nO5I4f69L2APqDZ0hLNo7qVhWA2bhCvrjhpQV4,25420
16
16
  fal/sync.py,sha256=ZuIJA2-hTPNANG9B_NNJZUsO68EIdTH0dc9MzeVE2VU,4340
17
17
  fal/utils.py,sha256=9q_QrQBlQN3nZYA1kEGRfhJWi4RjnO4H1uQswfaei9w,2146
18
18
  fal/workflows.py,sha256=Zl4f6Bs085hY40zmqScxDUyCu7zXkukDbW02iYOLTTI,14805
19
- fal/auth/__init__.py,sha256=i2zA9xiUQP3dxvL-6NFHodCHEktJ-1ApRYunLJamdtU,5807
20
- fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
19
+ fal/auth/__init__.py,sha256=zk0CqYxwTFud-9vdh3og6zMWkFf_1gM5CbLrAP49lcQ,5837
20
+ fal/auth/auth0.py,sha256=_OhfrqF41odNebFTr8SvUm-d9REVG6wfQBHhPIQxsZU,5468
21
21
  fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
22
22
  fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
23
23
  fal/cli/_utils.py,sha256=pHmKzpUWc2n4yPv4R0Y6DuZC5j-rVKU8oqdQDVW_-Lo,1591
24
24
  fal/cli/api.py,sha256=-rl50A00CxqVZtDh0iZmpCHMFY0jZySaumbPCe3MSoQ,2090
25
- fal/cli/apps.py,sha256=bc1QyWVsEOsabNEAB0zZ6IEjkpkkjdoplLFWgoruFGc,11234
25
+ fal/cli/apps.py,sha256=vKeTUw_uUxz5M9hlP0jcJ23qjR0GTz7ifeS4HBjKECo,10101
26
26
  fal/cli/auth.py,sha256=LLyYByasUJdiUGGrnZiKMO8TRt4LVYT7ocAUi_xSg2w,2106
27
27
  fal/cli/cli_nested_json.py,sha256=veSZU8_bYV3Iu1PAoxt-4BMBraNIqgH5nughbs2UKvE,13539
28
28
  fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
29
29
  fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
30
- fal/cli/deploy.py,sha256=JX1jwyAFE0-u-PGGqU-pphKMCUpaPFbYMjRMhK0VmoQ,7783
30
+ fal/cli/deploy.py,sha256=CWf0Y56w-hNCrht-qrfgiOi9nuvve1Kl5NFZJpt_oRA,7770
31
31
  fal/cli/doctor.py,sha256=U4ne9LX5gQwNblsYQ27XdO8AYDgbYjTO39EtxhwexRM,983
32
32
  fal/cli/keys.py,sha256=7Sf4DT4le89G42eAOt0ltRjbZAtE70AVQ62hmjZhUy0,3059
33
- fal/cli/main.py,sha256=AgT6fpcmSA3NkG_fv4MXOM_fAQ9kmhZHeljyNa3p27U,2225
33
+ fal/cli/main.py,sha256=4TnIno7fvFJbMPlpb8mnT7meKAR-UAOerxuo5qqPZRQ,2234
34
34
  fal/cli/parser.py,sha256=jYsGQ0BLQuKI7KtN1jnLVYKMbLtez7hPjwTNfG3UPSk,2964
35
35
  fal/cli/profile.py,sha256=vWngqkX7UizQIUQOpXauFz1UGJwDeh38Si6wXcIj3Eo,3396
36
36
  fal/cli/run.py,sha256=nAC12Qss4Fg1XmV0qOS9RdGNLYcdoHeRgQMvbTN4P9I,1202
37
- fal/cli/runners.py,sha256=f5KdIUqNiqjodlKGr-RQq7DKR3hIfVYZmlrFRBkzC-A,1034
37
+ fal/cli/runners.py,sha256=z7WkZZC9rCW2mU5enowVQsxd1W18iBtLNOnPjrzhEf0,3491
38
38
  fal/cli/secrets.py,sha256=QKSmazu-wiNF6fOpGL9v2TDYxAjX9KTi7ot7vnv6f5E,2474
39
39
  fal/cli/teams.py,sha256=ZrWdMvLRqPt1EuxoOKAfbP6sxJeOCaMeZ2LgZqw2S_w,2153
40
40
  fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
@@ -134,8 +134,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
134
134
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
135
135
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
136
136
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
137
- fal-1.11.2.dist-info/METADATA,sha256=BmLK6V5qidVEJ_qCf3egT714K26-dcQZ4AlsZx48-wM,4043
138
- fal-1.11.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
139
- fal-1.11.2.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
140
- fal-1.11.2.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
141
- fal-1.11.2.dist-info/RECORD,,
137
+ fal-1.11.4.dist-info/METADATA,sha256=4YfWQZFB7MSYrSraOshvcUl7x8GiLiQmL8cFMmgZaQs,4062
138
+ fal-1.11.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
139
+ fal-1.11.4.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
140
+ fal-1.11.4.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
141
+ fal-1.11.4.dist-info/RECORD,,
File without changes