fal 1.8.4__py3-none-any.whl → 1.9.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.8.4'
16
- __version_tuple__ = version_tuple = (1, 8, 4)
15
+ __version__ = version = '1.9.1'
16
+ __version_tuple__ = version_tuple = (1, 9, 1)
fal/cli/apps.py CHANGED
@@ -128,6 +128,7 @@ def _scale(args):
128
128
  and args.min_concurrency is None
129
129
  and args.request_timeout is None
130
130
  and args.startup_timeout is None
131
+ and args.machine_types is None
131
132
  ):
132
133
  args.console.log("No parameters for update were provided, ignoring.")
133
134
  return
@@ -140,6 +141,7 @@ def _scale(args):
140
141
  min_concurrency=args.min_concurrency,
141
142
  request_timeout=args.request_timeout,
142
143
  startup_timeout=args.startup_timeout,
144
+ machine_types=args.machine_types,
143
145
  )
144
146
  table = _apps_table([alias_info])
145
147
 
@@ -188,6 +190,13 @@ def _add_scale_parser(subparsers, parents):
188
190
  type=int,
189
191
  help="Startup timeout (seconds).",
190
192
  )
193
+ parser.add_argument(
194
+ "--machine-type",
195
+ type=str,
196
+ action="append",
197
+ dest="machine_types",
198
+ help="Machine type.",
199
+ )
191
200
  parser.set_defaults(func=_scale)
192
201
 
193
202
 
@@ -255,6 +264,24 @@ def _runners(args):
255
264
 
256
265
  args.console.print(table)
257
266
 
267
+ requests_table = Table()
268
+ requests_table.add_column("Runner ID")
269
+ requests_table.add_column("Request ID")
270
+ requests_table.add_column("Caller ID")
271
+
272
+ for runner in runners:
273
+ for lease in runner.external_metadata.get("leases", []):
274
+ if not (req_id := lease.get("request_id")):
275
+ continue
276
+
277
+ requests_table.add_row(
278
+ runner.runner_id,
279
+ req_id,
280
+ lease.get("caller_user_id") or "",
281
+ )
282
+
283
+ args.console.print(requests_table)
284
+
258
285
 
259
286
  def _add_runners_parser(subparsers, parents):
260
287
  runners_help = "List application runners."
fal/sdk.py CHANGED
@@ -11,6 +11,7 @@ import grpc
11
11
  import isolate_proto
12
12
  from isolate.connections.common import is_agent
13
13
  from isolate.logs import Log
14
+ from isolate.server import definitions as worker_definitions
14
15
  from isolate.server.interface import from_grpc, to_serialized_object, to_struct
15
16
  from isolate_proto.configuration import GRPC_OPTIONS
16
17
 
@@ -222,6 +223,7 @@ class RunnerInfo:
222
223
  in_flight_requests: int
223
224
  expiration_countdown: Optional[int]
224
225
  uptime: timedelta
226
+ external_metadata: dict[str, Any]
225
227
 
226
228
 
227
229
  @dataclass
@@ -353,6 +355,7 @@ def _from_grpc_alias_info(message: isolate_proto.AliasInfo) -> AliasInfo:
353
355
 
354
356
  @from_grpc.register(isolate_proto.RunnerInfo)
355
357
  def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
358
+ external_metadata = worker_definitions.struct_to_dict(message.external_metadata)
356
359
  return RunnerInfo(
357
360
  runner_id=message.runner_id,
358
361
  in_flight_requests=message.in_flight_requests,
@@ -360,6 +363,7 @@ def _from_grpc_runner_info(message: isolate_proto.RunnerInfo) -> RunnerInfo:
360
363
  if message.HasField("expiration_countdown")
361
364
  else None,
362
365
  uptime=timedelta(seconds=message.uptime),
366
+ external_metadata=external_metadata,
363
367
  )
364
368
 
365
369
 
@@ -578,7 +582,9 @@ class FalServerlessConnection:
578
582
  min_concurrency: int | None = None,
579
583
  request_timeout: int | None = None,
580
584
  startup_timeout: int | None = None,
585
+ machine_types: list[str] | None = None,
581
586
  ) -> AliasInfo:
587
+ print(machine_types)
582
588
  request = isolate_proto.UpdateApplicationRequest(
583
589
  application_name=application_name,
584
590
  keep_alive=keep_alive,
@@ -587,6 +593,7 @@ class FalServerlessConnection:
587
593
  min_concurrency=min_concurrency,
588
594
  request_timeout=request_timeout,
589
595
  startup_timeout=startup_timeout,
596
+ machine_types=machine_types,
590
597
  )
591
598
  res: isolate_proto.UpdateApplicationResult = self.stub.UpdateApplication(
592
599
  request
fal/toolkit/file/file.py CHANGED
@@ -156,6 +156,9 @@ class File(BaseModel):
156
156
  save_kwargs.setdefault(
157
157
  "object_lifecycle_preference", object_lifecycle_preference
158
158
  )
159
+ fallback_save_kwargs.setdefault(
160
+ "object_lifecycle_preference", object_lifecycle_preference
161
+ )
159
162
 
160
163
  try:
161
164
  url = repo.save(fdata, **save_kwargs)
@@ -165,11 +168,7 @@ class File(BaseModel):
165
168
 
166
169
  fallback_repo = get_builtin_repository(fallback_repository)
167
170
 
168
- url = fallback_repo.save(
169
- fdata,
170
- object_lifecycle_preference=object_lifecycle_preference,
171
- **fallback_save_kwargs,
172
- )
171
+ url = fallback_repo.save(fdata, **fallback_save_kwargs)
173
172
 
174
173
  return cls(
175
174
  url=url,
@@ -206,13 +205,20 @@ class File(BaseModel):
206
205
  object_lifecycle_preference = (
207
206
  request_lifecycle_preference(request) or LIFECYCLE_PREFERENCE.get()
208
207
  )
208
+ save_kwargs.setdefault(
209
+ "object_lifecycle_preference", object_lifecycle_preference
210
+ )
211
+ fallback_save_kwargs.setdefault(
212
+ "object_lifecycle_preference", object_lifecycle_preference
213
+ )
214
+
215
+ save_kwargs.setdefault("multipart", multipart)
216
+ fallback_save_kwargs.setdefault("multipart", multipart)
209
217
 
210
218
  try:
211
219
  url, data = repo.save_file(
212
220
  file_path,
213
221
  content_type=content_type,
214
- multipart=multipart,
215
- object_lifecycle_preference=object_lifecycle_preference,
216
222
  **save_kwargs,
217
223
  )
218
224
  except Exception:
@@ -224,8 +230,6 @@ class File(BaseModel):
224
230
  url, data = fallback_repo.save_file(
225
231
  file_path,
226
232
  content_type=content_type,
227
- multipart=multipart,
228
- object_lifecycle_preference=object_lifecycle_preference,
229
233
  **fallback_save_kwargs,
230
234
  )
231
235
 
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: fal
3
- Version: 1.8.4
3
+ Version: 1.9.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.16.0,>=0.15.0
8
+ Requires-Dist: isolate[build]<0.17.0,>=0.16.1
9
9
  Requires-Dist: isolate-proto<0.7.0,>=0.6.6
10
10
  Requires-Dist: grpcio==1.64.0
11
11
  Requires-Dist: dill==0.3.7
@@ -39,7 +39,7 @@ Requires-Dist: uvicorn<1,>=0.29.0
39
39
  Requires-Dist: cookiecutter
40
40
  Requires-Dist: tomli
41
41
  Provides-Extra: docs
42
- Requires-Dist: sphinx; extra == "docs"
42
+ Requires-Dist: sphinx<8.2.0; extra == "docs"
43
43
  Requires-Dist: sphinx-rtd-theme; extra == "docs"
44
44
  Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
45
45
  Provides-Extra: test
@@ -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=RzA6EmFHcrKXdLSPJdLNSA0ru2WnTYAYts_G-ig2BqQ,411
3
+ fal/_fal_version.py,sha256=Qz44wsspZw7yAXOrKT-ESJgTC4Qef5Bwv0rv6ExqH_U,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=ZbUoe12y6sVg5-bPbzFtqHTqZoQonVDaZRjlGNaHbcs,43983
@@ -12,7 +12,7 @@ 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=p-D_4b7wDpASrMXIeni-7LgFbQ8nUG2tvPn9Z4QDqos,23365
15
+ fal/sdk.py,sha256=Pjj9RZ6unEUnrj9JwDq6K4dzNoG9e0wYLwcNAbblnWw,23712
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
@@ -21,7 +21,7 @@ fal/auth/auth0.py,sha256=rSG1mgH-QGyKfzd7XyAaj1AYsWt-ho8Y_LZ-FUVWzh4,5421
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=45G0LEz2bW-69MUQKPdatVE_CBC2644gC-V0qdNEsco,1252
24
- fal/cli/apps.py,sha256=DeNzouQSv2cFZKDF4A5xdl3qzQ6NWbbgF3pivgmaIiI,9079
24
+ fal/cli/apps.py,sha256=fsDL9mypSEME-6UxN1S1vIu-e0ij6tEBfk-7PDRVG5A,9862
25
25
  fal/cli/auth.py,sha256=--MhfHGwxmtHbRkGioyn1prKn_U-pBzbz0G_QeZou-U,1352
26
26
  fal/cli/create.py,sha256=a8WDq-nJLFTeoIXqpb5cr7GR7YR9ZZrQCawNm34KXXE,627
27
27
  fal/cli/debug.py,sha256=u_urnyFzSlNnrq93zz_GXE9FX4VyVxDoamJJyrZpFI0,1312
@@ -50,7 +50,7 @@ fal/toolkit/exceptions.py,sha256=elHZ7dHCJG5zlHGSBbz-ilkZe9QUvQMomJFi8Pt91LA,198
50
50
  fal/toolkit/optimize.py,sha256=p75sovF0SmRP6zxzpIaaOmqlxvXB_xEz3XPNf59EF7w,1339
51
51
  fal/toolkit/types.py,sha256=kkbOsDKj1qPGb1UARTBp7yuJ5JUuyy7XQurYUBCdti8,4064
52
52
  fal/toolkit/file/__init__.py,sha256=FbNl6wD-P0aSSTUwzHt4HujBXrbC3ABmaigPQA4hRfg,70
53
- fal/toolkit/file/file.py,sha256=LyXmcHNsnBNA2MXFJ8UlHL1WHpZrOFYfwn2mfMJrdus,9216
53
+ fal/toolkit/file/file.py,sha256=Kb-mdR66OiSNTS2EGLLJYUqnAw-KN7diqhxvjS7EAZ0,9353
54
54
  fal/toolkit/file/types.py,sha256=MMAH_AyLOhowQPesOv1V25wB4qgbJ3vYNlnTPbdSv1M,2304
55
55
  fal/toolkit/file/providers/fal.py,sha256=XH5nPwnFGklWKtecfmWeaPGUwpR4mXmvESikQ5_FBjw,36918
56
56
  fal/toolkit/file/providers/gcp.py,sha256=DKeZpm1MjwbvEsYvkdXUtuLIJDr_UNbqXj_Mfv3NTeo,2437
@@ -130,8 +130,8 @@ openapi_fal_rest/models/workflow_node_type.py,sha256=-FzyeY2bxcNmizKbJI8joG7byRi
130
130
  openapi_fal_rest/models/workflow_schema.py,sha256=4K5gsv9u9pxx2ItkffoyHeNjBBYf6ur5bN4m_zePZNY,2019
131
131
  openapi_fal_rest/models/workflow_schema_input.py,sha256=2OkOXWHTNsCXHWS6EGDFzcJKkW5FIap-2gfO233EvZQ,1191
132
132
  openapi_fal_rest/models/workflow_schema_output.py,sha256=EblwSPAGfWfYVWw_WSSaBzQVju296is9o28rMBAd0mc,1196
133
- fal-1.8.4.dist-info/METADATA,sha256=E4R9L0BkZtbTt2mB_UlXNvfWY41mhqn6RW6fxxjg_4g,4002
134
- fal-1.8.4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
135
- fal-1.8.4.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
136
- fal-1.8.4.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
137
- fal-1.8.4.dist-info/RECORD,,
133
+ fal-1.9.1.dist-info/METADATA,sha256=2EM4mOdoLtFtgr9-kIkk6mVpDxqsVrV8PXMjVaVJwGM,4008
134
+ fal-1.9.1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
135
+ fal-1.9.1.dist-info/entry_points.txt,sha256=32zwTUC1U1E7nSTIGCoANQOQ3I7-qHG5wI6gsVz5pNU,37
136
+ fal-1.9.1.dist-info/top_level.txt,sha256=r257X1L57oJL8_lM0tRrfGuXFwm66i1huwQygbpLmHw,21
137
+ fal-1.9.1.dist-info/RECORD,,
File without changes