fal 1.5.18__py3-none-any.whl → 1.6.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/app.py +11 -2
- fal/cli/_utils.py +2 -1
- fal/cli/deploy.py +7 -2
- fal/cli/run.py +1 -1
- fal/container.py +1 -1
- fal/toolkit/file/file.py +3 -3
- {fal-1.5.18.dist-info → fal-1.6.1.dist-info}/METADATA +3 -3
- {fal-1.5.18.dist-info → fal-1.6.1.dist-info}/RECORD +12 -12
- {fal-1.5.18.dist-info → fal-1.6.1.dist-info}/WHEEL +1 -1
- {fal-1.5.18.dist-info → fal-1.6.1.dist-info}/entry_points.txt +0 -0
- {fal-1.5.18.dist-info → fal-1.6.1.dist-info}/top_level.txt +0 -0
fal/_fal_version.py
CHANGED
fal/app.py
CHANGED
|
@@ -23,7 +23,7 @@ from fal._serialization import include_modules_from
|
|
|
23
23
|
from fal.api import RouteSignature
|
|
24
24
|
from fal.exceptions import FalServerlessException, RequestCancelledException
|
|
25
25
|
from fal.logging import get_logger
|
|
26
|
-
from fal.toolkit.file import
|
|
26
|
+
from fal.toolkit.file import request_lifecycle_preference
|
|
27
27
|
from fal.toolkit.file.providers.fal import LIFECYCLE_PREFERENCE
|
|
28
28
|
|
|
29
29
|
REALTIME_APP_REQUIREMENTS = ["websockets", "msgpack"]
|
|
@@ -248,6 +248,14 @@ def _to_fal_app_name(name: str) -> str:
|
|
|
248
248
|
return "-".join(part.lower() for part in PART_FINDER_RE.findall(name))
|
|
249
249
|
|
|
250
250
|
|
|
251
|
+
def _print_python_packages() -> None:
|
|
252
|
+
from pkg_resources import working_set
|
|
253
|
+
|
|
254
|
+
packages = [f"{package.key}=={package.version}" for package in working_set]
|
|
255
|
+
|
|
256
|
+
print("[debug] Python packages installed:", ", ".join(packages))
|
|
257
|
+
|
|
258
|
+
|
|
251
259
|
class App(fal.api.BaseServable):
|
|
252
260
|
requirements: ClassVar[list[str]] = []
|
|
253
261
|
machine_type: ClassVar[str] = "S"
|
|
@@ -305,6 +313,7 @@ class App(fal.api.BaseServable):
|
|
|
305
313
|
|
|
306
314
|
@asynccontextmanager
|
|
307
315
|
async def lifespan(self, app: fastapi.FastAPI):
|
|
316
|
+
_print_python_packages()
|
|
308
317
|
await _call_any_fn(self.setup)
|
|
309
318
|
try:
|
|
310
319
|
yield
|
|
@@ -342,7 +351,7 @@ class App(fal.api.BaseServable):
|
|
|
342
351
|
@app.middleware("http")
|
|
343
352
|
async def set_global_object_preference(request, call_next):
|
|
344
353
|
try:
|
|
345
|
-
preference_dict =
|
|
354
|
+
preference_dict = request_lifecycle_preference(request)
|
|
346
355
|
if preference_dict is not None:
|
|
347
356
|
# This will not work properly for apps with multiplexing enabled
|
|
348
357
|
# we may mix up the preferences between requests
|
fal/cli/_utils.py
CHANGED
|
@@ -35,5 +35,6 @@ def get_app_data_from_toml(app_name):
|
|
|
35
35
|
|
|
36
36
|
app_auth = app_data.get("auth", "private")
|
|
37
37
|
app_deployment_strategy = app_data.get("deployment_strategy", "recreate")
|
|
38
|
+
app_no_scale = app_data.get("no_scale", False)
|
|
38
39
|
|
|
39
|
-
return app_ref, app_auth, app_deployment_strategy
|
|
40
|
+
return app_ref, app_auth, app_deployment_strategy, app_no_scale
|
fal/cli/deploy.py
CHANGED
|
@@ -68,6 +68,7 @@ def _deploy_from_reference(
|
|
|
68
68
|
args,
|
|
69
69
|
auth: Optional[Literal["public", "shared", "private"]] = None,
|
|
70
70
|
deployment_strategy: Optional[Literal["recreate", "rolling"]] = None,
|
|
71
|
+
no_scale: bool = False,
|
|
71
72
|
):
|
|
72
73
|
from fal.api import FalServerlessError, FalServerlessHost
|
|
73
74
|
from fal.utils import load_function_from
|
|
@@ -106,7 +107,7 @@ def _deploy_from_reference(
|
|
|
106
107
|
application_auth_mode=app_auth,
|
|
107
108
|
metadata=isolated_function.options.host.get("metadata", {}),
|
|
108
109
|
deployment_strategy=deployment_strategy,
|
|
109
|
-
scale=not
|
|
110
|
+
scale=not no_scale,
|
|
110
111
|
)
|
|
111
112
|
|
|
112
113
|
if app_id:
|
|
@@ -139,7 +140,9 @@ def _deploy(args):
|
|
|
139
140
|
raise ValueError("Cannot use --app-name or --auth with app name reference.")
|
|
140
141
|
|
|
141
142
|
app_name = args.app_ref[0]
|
|
142
|
-
app_ref, app_auth, app_deployment_strategy =
|
|
143
|
+
app_ref, app_auth, app_deployment_strategy, app_no_scale = (
|
|
144
|
+
get_app_data_from_toml(app_name)
|
|
145
|
+
)
|
|
143
146
|
file_path, func_name = RefAction.split_ref(app_ref)
|
|
144
147
|
|
|
145
148
|
# path/to/myfile.py::MyApp
|
|
@@ -148,6 +151,7 @@ def _deploy(args):
|
|
|
148
151
|
app_name = args.app_name
|
|
149
152
|
app_auth = args.auth
|
|
150
153
|
app_deployment_strategy = args.strategy
|
|
154
|
+
app_no_scale = args.no_scale
|
|
151
155
|
|
|
152
156
|
_deploy_from_reference(
|
|
153
157
|
(file_path, func_name),
|
|
@@ -155,6 +159,7 @@ def _deploy(args):
|
|
|
155
159
|
args,
|
|
156
160
|
app_auth,
|
|
157
161
|
app_deployment_strategy,
|
|
162
|
+
app_no_scale,
|
|
158
163
|
)
|
|
159
164
|
|
|
160
165
|
|
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, _
|
|
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/container.py
CHANGED
fal/toolkit/file/file.py
CHANGED
|
@@ -151,7 +151,7 @@ class File(BaseModel):
|
|
|
151
151
|
fdata = FileData(data, content_type, file_name)
|
|
152
152
|
|
|
153
153
|
object_lifecycle_preference = (
|
|
154
|
-
|
|
154
|
+
request_lifecycle_preference(request) or LIFECYCLE_PREFERENCE.get()
|
|
155
155
|
)
|
|
156
156
|
|
|
157
157
|
try:
|
|
@@ -207,7 +207,7 @@ class File(BaseModel):
|
|
|
207
207
|
|
|
208
208
|
content_type = content_type or "application/octet-stream"
|
|
209
209
|
object_lifecycle_preference = (
|
|
210
|
-
|
|
210
|
+
request_lifecycle_preference(request) or LIFECYCLE_PREFERENCE.get()
|
|
211
211
|
)
|
|
212
212
|
|
|
213
213
|
try:
|
|
@@ -293,7 +293,7 @@ class CompressedFile(File):
|
|
|
293
293
|
shutil.rmtree(self.extract_dir)
|
|
294
294
|
|
|
295
295
|
|
|
296
|
-
def
|
|
296
|
+
def request_lifecycle_preference(request: Optional[Request]) -> dict[str, str] | None:
|
|
297
297
|
import json
|
|
298
298
|
|
|
299
299
|
if request is None:
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.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
|
-
Requires-Dist: isolate[build]<0.
|
|
8
|
+
Requires-Dist: isolate[build]<0.16.0,>=0.15.0
|
|
9
9
|
Requires-Dist: isolate-proto<0.7.0,>=0.6.0
|
|
10
10
|
Requires-Dist: grpcio==1.64.0
|
|
11
11
|
Requires-Dist: dill==0.3.7
|
|
@@ -1,12 +1,12 @@
|
|
|
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=edFVVa8HpVPfLqL2y6CKtViSqJREfmXxInA-HCy-134,411
|
|
4
4
|
fal/_serialization.py,sha256=rD2YiSa8iuzCaZohZwN_MPEB-PpSKbWRDeaIDpTEjyY,7653
|
|
5
5
|
fal/_version.py,sha256=EBGqrknaf1WygENX-H4fBefLvHryvJBBGtVJetaB0NY,266
|
|
6
6
|
fal/api.py,sha256=xTtPvDqaEHsq2lFsMwRZiHb4hzjVY3y6lV-xbzkSetI,43375
|
|
7
|
-
fal/app.py,sha256=
|
|
7
|
+
fal/app.py,sha256=qJZcGGxCD3-kijbsXx3pocSyiiRKERuF5rXtx5hVt_Q,22902
|
|
8
8
|
fal/apps.py,sha256=RpmElElJnDYjsTRQOdNYiJwd74GEOGYA38L5O5GzNEg,11068
|
|
9
|
-
fal/container.py,sha256=
|
|
9
|
+
fal/container.py,sha256=X1DO5Ypb7oIDdDg_yqt4GCR8NogSvqSqa5hNdAPUx8A,623
|
|
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
|
|
@@ -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=
|
|
22
|
+
fal/cli/_utils.py,sha256=45G0LEz2bW-69MUQKPdatVE_CBC2644gC-V0qdNEsco,1252
|
|
23
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
|
|
27
|
+
fal/cli/deploy.py,sha256=-woTZObzntUenPFmWJwDaeCmBl3Vb7jqSkhPCIfk2SM,7581
|
|
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=O0i9wdLPxcd1u4CvXit-ufkT_UnON-baTN6v9HaHPmw,2027
|
|
31
31
|
fal/cli/parser.py,sha256=edCqFWYAQSOhrxeEK9BtFRlTEUAlG2JUDjS_vhZ_nHE,2868
|
|
32
|
-
fal/cli/run.py,sha256=
|
|
32
|
+
fal/cli/run.py,sha256=nAC12Qss4Fg1XmV0qOS9RdGNLYcdoHeRgQMvbTN4P9I,1202
|
|
33
33
|
fal/cli/runners.py,sha256=5pXuKq7nSkf0VpnppNnvxwP8XDq0SWkc6mkfizDwWMQ,1046
|
|
34
34
|
fal/cli/secrets.py,sha256=740msFm7d41HruudlcfqUXlFl53N-WmChsQP9B9M9Po,2572
|
|
35
35
|
fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
|
|
@@ -48,7 +48,7 @@ fal/toolkit/__init__.py,sha256=sV95wiUzKoiDqF9vDgq4q-BLa2sD6IpuKSqp5kdTQNE,658
|
|
|
48
48
|
fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
|
|
49
49
|
fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
|
|
50
50
|
fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
|
|
51
|
-
fal/toolkit/file/file.py,sha256=
|
|
51
|
+
fal/toolkit/file/file.py,sha256=fJpvydwefQ5CT_3q8YYfckH_6MdSFLF-se6jNOWGGxc,9475
|
|
52
52
|
fal/toolkit/file/types.py,sha256=MjZ6xAhKPv4rowLo2Vcbho0sX7AQ3lm3KFyYDcw0dL4,1845
|
|
53
53
|
fal/toolkit/file/providers/fal.py,sha256=V5CZz6EKmIs2-nm_mWeN9YxUOZCKIuPsZFjkZyazrgk,22375
|
|
54
54
|
fal/toolkit/file/providers/gcp.py,sha256=iQtkoYUqbmKKpC5srVOYtrruZ3reGRm5lz4kM8bshgk,2247
|
|
@@ -128,8 +128,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
|
|
|
128
128
|
openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
|
|
129
129
|
openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
|
|
130
130
|
openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
|
|
131
|
-
fal-1.
|
|
132
|
-
fal-1.
|
|
133
|
-
fal-1.
|
|
134
|
-
fal-1.
|
|
135
|
-
fal-1.
|
|
131
|
+
fal-1.6.1.dist-info/METADATA,sha256=eREr04PmVZ24cEVKPLaWj90uezt6pgvPCcb8UJAmvW4,3996
|
|
132
|
+
fal-1.6.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
133
|
+
fal-1.6.1.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
|
|
134
|
+
fal-1.6.1.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
|
|
135
|
+
fal-1.6.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|