fal 1.28.4__py3-none-any.whl → 1.29.1__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 +2 -2
- fal/cli/apps.py +6 -1
- fal/cli/runners.py +8 -2
- fal/sdk.py +19 -2
- fal/toolkit/file/providers/fal.py +6 -1
- {fal-1.28.4.dist-info → fal-1.29.1.dist-info}/METADATA +2 -2
- {fal-1.28.4.dist-info → fal-1.29.1.dist-info}/RECORD +10 -10
- {fal-1.28.4.dist-info → fal-1.29.1.dist-info}/WHEEL +0 -0
- {fal-1.28.4.dist-info → fal-1.29.1.dist-info}/entry_points.txt +0 -0
- {fal-1.28.4.dist-info → fal-1.29.1.dist-info}/top_level.txt +0 -0
fal/_fal_version.py
CHANGED
fal/cli/apps.py
CHANGED
|
@@ -5,6 +5,7 @@ from dataclasses import asdict
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
7
|
import fal.cli.runners as runners
|
|
8
|
+
from fal.sdk import RunnerState
|
|
8
9
|
|
|
9
10
|
from ._utils import get_client
|
|
10
11
|
from .parser import FalClientParser
|
|
@@ -298,7 +299,11 @@ def _runners(args):
|
|
|
298
299
|
alias_runners = connection.list_alias_runners(alias=args.app_name)
|
|
299
300
|
|
|
300
301
|
runners_table = runners.runners_table(alias_runners)
|
|
301
|
-
|
|
302
|
+
pending_runners = [
|
|
303
|
+
runner for runner in alias_runners if runner.state == RunnerState.PENDING
|
|
304
|
+
]
|
|
305
|
+
args.console.print(f"Runners: {len(alias_runners) - len(pending_runners)}")
|
|
306
|
+
args.console.print(f"Pending Runners: {len(pending_runners)}")
|
|
302
307
|
# Drop the alias column, which is the first column
|
|
303
308
|
runners_table.columns.pop(0)
|
|
304
309
|
args.console.print(runners_table)
|
fal/cli/runners.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import List
|
|
4
4
|
|
|
5
|
-
from fal.sdk import RunnerInfo
|
|
5
|
+
from fal.sdk import RunnerInfo, RunnerState
|
|
6
6
|
|
|
7
7
|
from ._utils import get_client
|
|
8
8
|
from .parser import FalClientParser
|
|
@@ -19,6 +19,7 @@ def runners_table(runners: List[RunnerInfo]):
|
|
|
19
19
|
table.add_column("Expires In")
|
|
20
20
|
table.add_column("Uptime")
|
|
21
21
|
table.add_column("Revision")
|
|
22
|
+
table.add_column("State")
|
|
22
23
|
|
|
23
24
|
for runner in runners:
|
|
24
25
|
external_metadata = runner.external_metadata
|
|
@@ -45,6 +46,7 @@ def runners_table(runners: List[RunnerInfo]):
|
|
|
45
46
|
),
|
|
46
47
|
f"{runner.uptime} ({runner.uptime.total_seconds()}s)",
|
|
47
48
|
runner.revision,
|
|
49
|
+
runner.state.value,
|
|
48
50
|
)
|
|
49
51
|
|
|
50
52
|
return table
|
|
@@ -82,7 +84,11 @@ def _list(args):
|
|
|
82
84
|
client = get_client(args.host, args.team)
|
|
83
85
|
with client.connect() as connection:
|
|
84
86
|
runners = connection.list_runners()
|
|
85
|
-
|
|
87
|
+
pending_runners = [
|
|
88
|
+
runner for runner in runners if runner.state == RunnerState.PENDING
|
|
89
|
+
]
|
|
90
|
+
args.console.print(f"Runners: {len(runners) - len(pending_runners)}")
|
|
91
|
+
args.console.print(f"Pending Runners: {len(pending_runners)}")
|
|
86
92
|
args.console.print(runners_table(runners))
|
|
87
93
|
|
|
88
94
|
requests_table = runners_requests_table(runners)
|
fal/sdk.py
CHANGED
|
@@ -261,6 +261,21 @@ class AliasInfo:
|
|
|
261
261
|
valid_regions: list[str]
|
|
262
262
|
|
|
263
263
|
|
|
264
|
+
class RunnerState(Enum):
|
|
265
|
+
RUNNING = "running"
|
|
266
|
+
PENDING = "pending"
|
|
267
|
+
UNKNOWN = "unknown"
|
|
268
|
+
|
|
269
|
+
@staticmethod
|
|
270
|
+
def from_proto(proto: isolate_proto.RunnerInfo.State) -> RunnerState:
|
|
271
|
+
if proto is isolate_proto.RunnerInfo.State.RUNNING:
|
|
272
|
+
return RunnerState.RUNNING
|
|
273
|
+
elif proto is isolate_proto.RunnerInfo.State.PENDING:
|
|
274
|
+
return RunnerState.PENDING
|
|
275
|
+
else:
|
|
276
|
+
return RunnerState.UNKNOWN
|
|
277
|
+
|
|
278
|
+
|
|
264
279
|
@dataclass
|
|
265
280
|
class RunnerInfo:
|
|
266
281
|
runner_id: str
|
|
@@ -270,6 +285,7 @@ class RunnerInfo:
|
|
|
270
285
|
external_metadata: dict[str, Any]
|
|
271
286
|
revision: str
|
|
272
287
|
alias: str
|
|
288
|
+
state: RunnerState
|
|
273
289
|
|
|
274
290
|
|
|
275
291
|
@dataclass
|
|
@@ -421,6 +437,7 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
|
|
|
421
437
|
external_metadata=external_metadata,
|
|
422
438
|
revision=message.revision,
|
|
423
439
|
alias=message.alias,
|
|
440
|
+
state=RunnerState.from_proto(message.state),
|
|
424
441
|
)
|
|
425
442
|
|
|
426
443
|
|
|
@@ -769,7 +786,7 @@ class FalServerlessConnection:
|
|
|
769
786
|
return [from_grpc(alias) for alias in response.aliases]
|
|
770
787
|
|
|
771
788
|
def list_alias_runners(self, alias: str) -> list[RunnerInfo]:
|
|
772
|
-
request = isolate_proto.ListAliasRunnersRequest(alias=alias)
|
|
789
|
+
request = isolate_proto.ListAliasRunnersRequest(alias=alias, list_pending=True)
|
|
773
790
|
response = self.stub.ListAliasRunners(request)
|
|
774
791
|
return [from_grpc(runner) for runner in response.runners]
|
|
775
792
|
|
|
@@ -797,6 +814,6 @@ class FalServerlessConnection:
|
|
|
797
814
|
self.stub.KillRunner(request)
|
|
798
815
|
|
|
799
816
|
def list_runners(self) -> list[RunnerInfo]:
|
|
800
|
-
request = isolate_proto.ListRunnersRequest()
|
|
817
|
+
request = isolate_proto.ListRunnersRequest(list_pending=True)
|
|
801
818
|
response = self.stub.ListRunners(request)
|
|
802
819
|
return [from_grpc(runner) for runner in response.runners]
|
|
@@ -10,7 +10,7 @@ from dataclasses import dataclass
|
|
|
10
10
|
from datetime import datetime, timezone
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from typing import Any, Dict, Generator, Generic, TypeVar
|
|
13
|
-
from urllib.error import HTTPError
|
|
13
|
+
from urllib.error import HTTPError, URLError
|
|
14
14
|
from urllib.parse import urlparse, urlunparse
|
|
15
15
|
from urllib.request import Request, urlopen
|
|
16
16
|
from urllib.response import addinfourl
|
|
@@ -44,6 +44,11 @@ def _urlopen(
|
|
|
44
44
|
def _should_retry(exc: Exception) -> bool:
|
|
45
45
|
if isinstance(exc, HTTPError) and exc.code in RETRY_CODES:
|
|
46
46
|
return True
|
|
47
|
+
elif type(exc) is URLError:
|
|
48
|
+
# URLError is a base class for other errors,
|
|
49
|
+
# but it can be raised directly, e.g.
|
|
50
|
+
# URLError: <urlopen error [Errno -3] Temporary failure in name resolution>
|
|
51
|
+
return True
|
|
47
52
|
|
|
48
53
|
if isinstance(exc, TimeoutError):
|
|
49
54
|
return True
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.29.1
|
|
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.19.0,>=0.18.0
|
|
9
|
-
Requires-Dist: isolate-proto<0.
|
|
9
|
+
Requires-Dist: isolate-proto<0.12.0,>=0.11.0
|
|
10
10
|
Requires-Dist: grpcio<2,>=1.64.0
|
|
11
11
|
Requires-Dist: dill==0.3.7
|
|
12
12
|
Requires-Dist: cloudpickle==3.0.0
|
|
@@ -1,6 +1,6 @@
|
|
|
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=
|
|
3
|
+
fal/_fal_version.py,sha256=LEnNi1cixmgGAOMJGFHnhQTZbgOnQnR2eYoT1fWIhAE,513
|
|
4
4
|
fal/_serialization.py,sha256=npXNsFJ5G7jzBeBIyVMH01Ww34mGY4XWhHpRbSrTtnQ,7598
|
|
5
5
|
fal/_version.py,sha256=1BbTFnucNC_6ldKJ_ZoC722_UkW4S9aDBSW9L0fkKAw,2315
|
|
6
6
|
fal/api.py,sha256=TWUpQICgsRO5aDdRP8A3sFI26P6QM93TobcW9M4E0lQ,47501
|
|
@@ -13,7 +13,7 @@ fal/flags.py,sha256=QonyDM7R2GqfAB1bJr46oriu-fHJCkpUwXuSdanePWg,987
|
|
|
13
13
|
fal/project.py,sha256=QgfYfMKmNobMPufrAP_ga1FKcIAlSbw18Iar1-0qepo,2650
|
|
14
14
|
fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
|
|
16
|
-
fal/sdk.py,sha256=
|
|
16
|
+
fal/sdk.py,sha256=uYvb6jpy2uRkjhzQxWhkna-yWc53kdywl_8p6qTnyPs,26775
|
|
17
17
|
fal/sync.py,sha256=ZuIJA2-hTPNANG9B_NNJZUsO68EIdTH0dc9MzeVE2VU,4340
|
|
18
18
|
fal/utils.py,sha256=iQTBG3-i6JZgHkkwbY_I4210g0xoW-as51yrke608u0,2208
|
|
19
19
|
fal/workflows.py,sha256=Zl4f6Bs085hY40zmqScxDUyCu7zXkukDbW02iYOLTTI,14805
|
|
@@ -23,7 +23,7 @@ fal/auth/local.py,sha256=sndkM6vKpeVny6NHTacVlTbiIFqaksOmw0Viqs_RN1U,1790
|
|
|
23
23
|
fal/cli/__init__.py,sha256=padK4o0BFqq61kxAA1qQ0jYr2SuhA2mf90B3AaRkmJA,37
|
|
24
24
|
fal/cli/_utils.py,sha256=ulYezhr3G29nTIF8MDQ6tsW01Oj1zPo-YSqMoBi05Ic,1871
|
|
25
25
|
fal/cli/api.py,sha256=ZuDE_PIC-czzneTAWMwvC7P7WnwIyluNZSuJqzCFhqI,2640
|
|
26
|
-
fal/cli/apps.py,sha256=
|
|
26
|
+
fal/cli/apps.py,sha256=pty0v0RIihCeKl1xG9NWIUMTWGhGUJf452x58EfBL-M,11242
|
|
27
27
|
fal/cli/auth.py,sha256=Qe-Z3ycXJnOzHimz5PjCQYoni8MF4csmdL19yGN7a1o,5171
|
|
28
28
|
fal/cli/cli_nested_json.py,sha256=veSZU8_bYV3Iu1PAoxt-4BMBraNIqgH5nughbs2UKvE,13539
|
|
29
29
|
fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
|
|
@@ -36,7 +36,7 @@ fal/cli/main.py,sha256=LnJCe83Fdr5-i3Fkpvrd9BZPjHtcX_H1EEmy6rVlCz8,3180
|
|
|
36
36
|
fal/cli/parser.py,sha256=jYsGQ0BLQuKI7KtN1jnLVYKMbLtez7hPjwTNfG3UPSk,2964
|
|
37
37
|
fal/cli/profile.py,sha256=agyGFQRLHOtzJEdN3Pn9317rg044XaszNCZrf0ELK-8,6016
|
|
38
38
|
fal/cli/run.py,sha256=nAC12Qss4Fg1XmV0qOS9RdGNLYcdoHeRgQMvbTN4P9I,1202
|
|
39
|
-
fal/cli/runners.py,sha256=
|
|
39
|
+
fal/cli/runners.py,sha256=4knYZLG5WagdHoBUpjVsh_8BXHebU_rAtlRyRmJDZWI,3976
|
|
40
40
|
fal/cli/secrets.py,sha256=QKSmazu-wiNF6fOpGL9v2TDYxAjX9KTi7ot7vnv6f5E,2474
|
|
41
41
|
fal/cli/teams.py,sha256=6fR2rKJtiUJPThP7QsO4NLo9UdhUxraGvQZk3_Di6Ow,1218
|
|
42
42
|
fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
|
|
@@ -61,7 +61,7 @@ fal/toolkit/audio/audio.py,sha256=gt458h989iQ-EhQSH-mCuJuPBY4RneLJE05f_QWU1E0,57
|
|
|
61
61
|
fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
|
|
62
62
|
fal/toolkit/file/file.py,sha256=_KCKmtmBkBIKD_gFOZALV10dCtOFZTC9MQw2qmdeevw,11013
|
|
63
63
|
fal/toolkit/file/types.py,sha256=MMAH_AyLOhowQPesOv1V25wB4qgbJ3vYNlnTPbdSv1M,2304
|
|
64
|
-
fal/toolkit/file/providers/fal.py,sha256=
|
|
64
|
+
fal/toolkit/file/providers/fal.py,sha256=z2Htg7DJoBxq_y4Q71KOGM1mHvJzUQCGtz2_m2lqK6c,47155
|
|
65
65
|
fal/toolkit/file/providers/gcp.py,sha256=DKeZpm1MjwbvEsYvkdXUtuLIJDr_UNbqXj_Mfv3NTeo,2437
|
|
66
66
|
fal/toolkit/file/providers/r2.py,sha256=YqnYkkAo_ZKIa-xoSuDnnidUFwJWHdziAR34PE6irdI,3061
|
|
67
67
|
fal/toolkit/file/providers/s3.py,sha256=EI45T54Mox7lHZKROss_O8o0DIn3CHP9k1iaNYVrxvg,2714
|
|
@@ -142,8 +142,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
|
|
|
142
142
|
openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
|
|
143
143
|
openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
|
|
144
144
|
openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
|
|
145
|
-
fal-1.
|
|
146
|
-
fal-1.
|
|
147
|
-
fal-1.
|
|
148
|
-
fal-1.
|
|
149
|
-
fal-1.
|
|
145
|
+
fal-1.29.1.dist-info/METADATA,sha256=46KbSDN8ByPItsEXR770ZU8JZQZgAaUBEC6Yc2G82MU,4089
|
|
146
|
+
fal-1.29.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
147
|
+
fal-1.29.1.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
|
|
148
|
+
fal-1.29.1.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
|
|
149
|
+
fal-1.29.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|