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 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.18'
16
- __version_tuple__ = version_tuple = (1, 5, 18)
15
+ __version__ = version = '1.6.1'
16
+ __version_tuple__ = version_tuple = (1, 6, 1)
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 request_lifecycle_repference
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 = request_lifecycle_repference(request)
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 args.no_scale,
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 = get_app_data_from_toml(app_name)
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, _, _ = 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/container.py CHANGED
@@ -3,7 +3,7 @@ class ContainerImage:
3
3
  from a Dockerfile.
4
4
  """
5
5
 
6
- _known_keys = {"dockerfile_str", "build_env", "build_args"}
6
+ _known_keys = {"dockerfile_str", "build_args", "registries"}
7
7
 
8
8
  @classmethod
9
9
  def from_dockerfile_str(cls, text: str, **kwargs):
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
- request_lifecycle_repference(request) or LIFECYCLE_PREFERENCE.get()
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
- request_lifecycle_repference(request) or LIFECYCLE_PREFERENCE.get()
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 request_lifecycle_repference(request: Optional[Request]) -> dict[str, str] | None:
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
1
+ Metadata-Version: 2.2
2
2
  Name: fal
3
- Version: 1.5.18
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.15.0,>=0.14.3
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=4dXebS3MmuJVzRzthWNVLSC2f7ozQPniKxTATW5ZukM,413
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=_0bWVe4BmbN01UoMso21-eJlLugDJ1CxVnzQdCtK93k,22636
7
+ fal/app.py,sha256=qJZcGGxCD3-kijbsXx3pocSyiiRKERuF5rXtx5hVt_Q,22902
8
8
  fal/apps.py,sha256=RpmElElJnDYjsTRQOdNYiJwd74GEOGYA38L5O5GzNEg,11068
9
- fal/container.py,sha256=V7riyyq8AZGwEX9QaqRQDZyDN_bUKeRKV1OOZArXjL0,622
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=u__PSeNxSC_4Psi3ZwLjefgNQVkYRpVH--vmwK7ppro,1187
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=ZBM4pLDDj9ZntlSoFvK_-ZGO-lAOHoZFkYXS-OAxXT0,7461
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=J1lSZ_wJIhrygSduMr0Wf2pQ8OUJlFbyH5KKUjxDF6w,1204
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=yWzR0ZIqDwxwQDRiVv89_ShepzdBJoXdK5QYNph_9gQ,9475
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.5.18.dist-info/METADATA,sha256=rak1rWy5iihT-QIUO9zKI8MUF7Elly9lUy_zwrBCamI,3997
132
- fal-1.5.18.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
133
- fal-1.5.18.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
134
- fal-1.5.18.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
135
- fal-1.5.18.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5