fal 0.11.2__py3-none-any.whl → 0.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.

Files changed (42) hide show
  1. fal/__init__.py +2 -28
  2. fal/api.py +13 -13
  3. fal/app.py +162 -0
  4. fal/cli.py +124 -73
  5. fal/exceptions/_base.py +1 -1
  6. fal/exceptions/auth.py +1 -1
  7. fal/rest_client.py +1 -0
  8. fal/sdk.py +41 -10
  9. fal/sync.py +3 -2
  10. fal/toolkit/file/file.py +6 -5
  11. fal/toolkit/file/providers/r2.py +83 -0
  12. fal/toolkit/file/types.py +1 -1
  13. fal/toolkit/image/image.py +2 -2
  14. {fal-0.11.2.dist-info → fal-0.11.4.dist-info}/METADATA +40 -3
  15. {fal-0.11.2.dist-info → fal-0.11.4.dist-info}/RECORD +42 -40
  16. openapi_fal_rest/api/admin/handle_user_lock.py +6 -2
  17. openapi_fal_rest/api/applications/get_status_applications_app_user_id_app_alias_or_id_status_get.py +6 -2
  18. openapi_fal_rest/api/billing/delete_payment_method.py +9 -3
  19. openapi_fal_rest/api/billing/get_setup_intent_key.py +6 -2
  20. openapi_fal_rest/api/billing/get_user_price.py +6 -2
  21. openapi_fal_rest/api/billing/get_user_spending.py +6 -2
  22. openapi_fal_rest/api/billing/handle_stripe_webhook.py +21 -7
  23. openapi_fal_rest/api/billing/upcoming_invoice.py +6 -2
  24. openapi_fal_rest/api/billing/update_customer_budget.py +6 -2
  25. openapi_fal_rest/api/files/check_dir_hash.py +9 -3
  26. openapi_fal_rest/api/files/delete.py +6 -2
  27. openapi_fal_rest/api/files/download.py +6 -2
  28. openapi_fal_rest/api/files/file_exists.py +6 -2
  29. openapi_fal_rest/api/files/upload_from_url.py +6 -2
  30. openapi_fal_rest/api/files/upload_local_file.py +9 -3
  31. openapi_fal_rest/api/keys/create_key.py +6 -2
  32. openapi_fal_rest/api/keys/delete_key.py +6 -2
  33. openapi_fal_rest/api/tokens/create_token.py +6 -2
  34. openapi_fal_rest/api/usage/get_gateway_request_stats_by_time.py +41 -7
  35. openapi_fal_rest/api/usage/per_machine_usage_details.py +3 -1
  36. openapi_fal_rest/models/__init__.py +3 -1
  37. openapi_fal_rest/models/body_upload_file.py +4 -1
  38. openapi_fal_rest/models/body_upload_local_file.py +4 -1
  39. openapi_fal_rest/models/get_gateway_request_stats_by_time_response_get_gateway_request_stats_by_time.py +15 -5
  40. openapi_fal_rest/models/grouped_usage_detail.py +6 -6
  41. {fal-0.11.2.dist-info → fal-0.11.4.dist-info}/WHEEL +0 -0
  42. {fal-0.11.2.dist-info → fal-0.11.4.dist-info}/entry_points.txt +0 -0
fal/sdk.py CHANGED
@@ -184,7 +184,9 @@ class AliasInfo:
184
184
  alias: str
185
185
  revision: str
186
186
  auth_mode: str
187
+ keep_alive: int
187
188
  max_concurrency: int
189
+ max_multiplexing: int
188
190
 
189
191
 
190
192
  @dataclass
@@ -258,7 +260,9 @@ def _from_grpc_alias_info(message: isolate_proto.AliasInfo) -> AliasInfo:
258
260
  alias=message.alias,
259
261
  revision=message.revision,
260
262
  auth_mode=auth_mode,
263
+ keep_alive=message.keep_alive,
261
264
  max_concurrency=message.max_concurrency,
265
+ max_multiplexing=message.max_multiplexing,
262
266
  )
263
267
 
264
268
 
@@ -306,7 +310,8 @@ class MachineRequirements:
306
310
  exposed_port: int | None = None
307
311
  scheduler: str | None = None
308
312
  scheduler_options: dict[str, Any] | None = None
309
- max_multiplexing: int = FAL_SERVERLESS_DEFAULT_MAX_MULTIPLEXING
313
+ max_concurrency: int | None = None
314
+ max_multiplexing: int | None = None
310
315
 
311
316
 
312
317
  @dataclass
@@ -386,7 +391,6 @@ class FalServerlessConnection:
386
391
  application_name: str | None = None,
387
392
  application_auth_mode: Literal["public", "private", "shared"] | None = None,
388
393
  *,
389
- max_concurrency: int | None = None,
390
394
  serialization_method: str = _DEFAULT_SERIALIZATION_METHOD,
391
395
  machine_requirements: MachineRequirements | None = None,
392
396
  metadata: dict[str, Any] | None = None,
@@ -402,6 +406,7 @@ class FalServerlessConnection:
402
406
  scheduler_options=to_struct(
403
407
  machine_requirements.scheduler_options or {}
404
408
  ),
409
+ max_concurrency=machine_requirements.max_concurrency,
405
410
  max_multiplexing=machine_requirements.max_multiplexing,
406
411
  )
407
412
  else:
@@ -423,7 +428,6 @@ class FalServerlessConnection:
423
428
  function=wrapped_function,
424
429
  environments=environments,
425
430
  machine_requirements=wrapped_requirements,
426
- max_concurrency=max_concurrency,
427
431
  application_name=application_name,
428
432
  auth_mode=auth_mode,
429
433
  metadata=struct_metadata,
@@ -432,24 +436,25 @@ class FalServerlessConnection:
432
436
  yield from_grpc(partial_result)
433
437
 
434
438
  def scale(self, application_name: str, max_concurrency: int | None = None) -> None:
435
- request = isolate_proto.ScaleApplicationRequest(
436
- application_name=application_name,
437
- max_concurrency=max_concurrency,
438
- )
439
- self.stub.ScaleApplication(request)
439
+ raise NotImplementedError
440
440
 
441
441
  def update_application(
442
442
  self,
443
443
  application_name: str,
444
444
  keep_alive: int | None = None,
445
445
  max_multiplexing: int | None = None,
446
- ) -> None:
446
+ max_concurrency: int | None = None,
447
+ ) -> AliasInfo:
447
448
  request = isolate_proto.UpdateApplicationRequest(
448
449
  application_name=application_name,
449
450
  keep_alive=keep_alive,
450
451
  max_multiplexing=max_multiplexing,
452
+ max_concurrency=max_concurrency,
453
+ )
454
+ res: isolate_proto.UpdateApplicationResult = self.stub.UpdateApplication(
455
+ request
451
456
  )
452
- self.stub.UpdateApplication(request)
457
+ return from_grpc(res.alias_info)
453
458
 
454
459
  def run(
455
460
  self,
@@ -471,6 +476,7 @@ class FalServerlessConnection:
471
476
  scheduler_options=to_struct(
472
477
  machine_requirements.scheduler_options or {}
473
478
  ),
479
+ max_concurrency=machine_requirements.max_concurrency,
474
480
  max_multiplexing=machine_requirements.max_multiplexing,
475
481
  )
476
482
  else:
@@ -488,6 +494,31 @@ class FalServerlessConnection:
488
494
  for partial_result in self.stub.Run(request):
489
495
  yield from_grpc(partial_result)
490
496
 
497
+ def create_alias(
498
+ self,
499
+ alias: str,
500
+ revision: str,
501
+ auth_mode: Literal["public", "private", "shared"],
502
+ ):
503
+ if auth_mode == "public":
504
+ auth = isolate_proto.ApplicationAuthMode.PUBLIC
505
+ elif auth_mode == "shared":
506
+ auth = isolate_proto.ApplicationAuthMode.SHARED
507
+ else:
508
+ auth = isolate_proto.ApplicationAuthMode.PRIVATE
509
+
510
+ request = isolate_proto.SetAliasRequest(
511
+ alias=alias,
512
+ revision=revision,
513
+ auth_mode=auth,
514
+ )
515
+ self.stub.SetAlias(request)
516
+
517
+ def delete_alias(self, alias: str) -> str:
518
+ request = isolate_proto.DeleteAliasRequest(alias=alias)
519
+ res: isolate_proto.DeleteAliasResult = self.stub.DeleteAlias(request)
520
+ return res.revision
521
+
491
522
  def list_aliases(self) -> list[AliasInfo]:
492
523
  request = isolate_proto.ListAliasesRequest()
493
524
  response: isolate_proto.ListAliasesResult = self.stub.ListAliases(request)
fal/sync.py CHANGED
@@ -5,13 +5,14 @@ import os
5
5
  import zipfile
6
6
  from pathlib import Path
7
7
 
8
+ from fal.rest_client import REST_CLIENT
9
+ from pathspec import PathSpec
10
+
8
11
  import openapi_fal_rest.api.files.check_dir_hash as check_dir_hash_api
9
12
  import openapi_fal_rest.api.files.upload_local_file as upload_local_file_api
10
13
  import openapi_fal_rest.models.body_upload_local_file as upload_file_model
11
14
  import openapi_fal_rest.models.hash_check as hash_check_model
12
15
  import openapi_fal_rest.types as rest_types
13
- from fal.rest_client import REST_CLIENT
14
- from pathspec import PathSpec
15
16
 
16
17
 
17
18
  def _check_hash(target_path: str, hash_string: str) -> bool:
fal/toolkit/file/file.py CHANGED
@@ -1,25 +1,26 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from pathlib import Path
4
- from typing import Callable, Literal
4
+ from typing import Callable
5
5
 
6
6
  from fal.toolkit.file.providers.fal import FalFileRepository, InMemoryRepository
7
7
  from fal.toolkit.file.providers.gcp import GoogleStorageRepository
8
+ from fal.toolkit.file.providers.r2 import R2Repository
8
9
  from fal.toolkit.file.types import FileData, FileRepository, RepositoryId
9
10
  from fal.toolkit.mainify import mainify
10
11
  from pydantic import BaseModel, Field, PrivateAttr
11
12
 
12
- BuiltInRepositoryId = Literal["fal", "in_memory", "gcp_storage"]
13
13
  FileRepositoryFactory = Callable[[], FileRepository]
14
14
 
15
- BUILT_IN_REPOSITORIES: dict[BuiltInRepositoryId, FileRepositoryFactory] = {
15
+ BUILT_IN_REPOSITORIES: dict[RepositoryId, FileRepositoryFactory] = {
16
16
  "fal": lambda: FalFileRepository(),
17
17
  "in_memory": lambda: InMemoryRepository(),
18
18
  "gcp_storage": lambda: GoogleStorageRepository(),
19
+ "r2": lambda: R2Repository(),
19
20
  }
20
21
 
21
22
 
22
- def get_builtin_repository(id: BuiltInRepositoryId) -> FileRepository:
23
+ def get_builtin_repository(id: RepositoryId) -> FileRepository:
23
24
  if id not in BUILT_IN_REPOSITORIES.keys():
24
25
  raise ValueError(f'"{id}" is not a valid built-in file repository')
25
26
  return BUILT_IN_REPOSITORIES[id]()
@@ -27,7 +28,7 @@ def get_builtin_repository(id: BuiltInRepositoryId) -> FileRepository:
27
28
 
28
29
  get_builtin_repository.__module__ = "__main__"
29
30
 
30
- DEFAULT_REPOSITORY: FileRepository | BuiltInRepositoryId = "fal"
31
+ DEFAULT_REPOSITORY: FileRepository | RepositoryId = "fal"
31
32
 
32
33
 
33
34
  @mainify
@@ -0,0 +1,83 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ from dataclasses import dataclass
6
+ from io import BytesIO
7
+
8
+ from fal.toolkit.file.types import FileData, FileRepository
9
+ from fal.toolkit.mainify import mainify
10
+
11
+ DEFAULT_URL_TIMEOUT = 60 * 15 # 15 minutes
12
+
13
+
14
+ @mainify
15
+ @dataclass
16
+ class R2Repository(FileRepository):
17
+ bucket_name: str = "fal_file_storage"
18
+ url_expiration: int = DEFAULT_URL_TIMEOUT
19
+ r2_account_json: str | None = None
20
+ key: str = ""
21
+
22
+ _storage_client = None
23
+ _bucket = None
24
+
25
+ def __post_init__(self):
26
+ import boto3
27
+ from botocore.client import Config
28
+
29
+ r2_account_json = self.r2_account_json
30
+ if r2_account_json is None:
31
+ r2_account_json = os.environ.get("R2_CREDS_JSON")
32
+ if r2_account_json is None:
33
+ raise Exception("R2_CREDS_JSON environment secret is not set")
34
+
35
+ r2_account_info = json.loads(r2_account_json)
36
+ account_id = r2_account_info["ACCOUNT_ID"]
37
+ access_key_id = r2_account_info["ACCESS_KEY_ID"]
38
+ secret_access_key = r2_account_info["SECRET_ACCESS_KEY"]
39
+
40
+ self._s3_client = boto3.client(
41
+ "s3",
42
+ endpoint_url=f"https://{account_id}.r2.cloudflarestorage.com",
43
+ aws_access_key_id=access_key_id,
44
+ aws_secret_access_key=secret_access_key,
45
+ config=Config(signature_version="s3v4"),
46
+ )
47
+ self._s3_resource = boto3.resource(
48
+ "s3",
49
+ endpoint_url=f"https://{account_id}.r2.cloudflarestorage.com",
50
+ aws_access_key_id=access_key_id,
51
+ aws_secret_access_key=secret_access_key,
52
+ )
53
+
54
+ self._bucket = self._s3_resource.Bucket(self.bucket_name)
55
+
56
+ @property
57
+ def storage_client(self):
58
+ if self._s3_resource is None:
59
+ raise Exception("S3 Resource is not initialized")
60
+
61
+ return self._s3_resource
62
+
63
+ @property
64
+ def bucket(self):
65
+ if self._bucket is None:
66
+ raise Exception("S3 bucket is not initialized")
67
+
68
+ return self._bucket
69
+
70
+ def save(self, data: FileData) -> str:
71
+ destination_path = os.path.join(self.key, data.file_name)
72
+
73
+ s3_object = self.bucket.Object(destination_path)
74
+ s3_object.upload_fileobj(
75
+ BytesIO(data.data), ExtraArgs={"ContentType": data.content_type}
76
+ )
77
+
78
+ public_url = self._s3_client.generate_presigned_url(
79
+ ClientMethod="get_object",
80
+ Params={"Bucket": self.bucket_name, "Key": destination_path},
81
+ ExpiresIn=self.url_expiration,
82
+ )
83
+ return public_url
fal/toolkit/file/types.py CHANGED
@@ -31,7 +31,7 @@ class FileData:
31
31
  self.file_name = file_name
32
32
 
33
33
 
34
- RepositoryId = Literal["fal", "in_memory", "gcp_storage"]
34
+ RepositoryId = Literal["fal", "in_memory", "gcp_storage", "r2"]
35
35
 
36
36
 
37
37
  @mainify
@@ -25,10 +25,10 @@ ImageSizePreset = Literal[
25
25
  @mainify
26
26
  class ImageSize(BaseModel):
27
27
  width: int = Field(
28
- default=512, description="The width of the generated image.", gt=0, le=4096
28
+ default=512, description="The width of the generated image.", gt=0, le=14142
29
29
  )
30
30
  height: int = Field(
31
- default=512, description="The height of the generated image.", gt=0, le=4096
31
+ default=512, description="The height of the generated image.", gt=0, le=14142
32
32
  )
33
33
 
34
34
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fal
3
- Version: 0.11.2
3
+ Version: 0.11.4
4
4
  Summary: fal is an easy-to-use Serverless Python Framework
5
5
  Author: Features & Labels
6
6
  Author-email: hello@fal.ai
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Requires-Dist: attrs (>=21.3.0)
14
14
  Requires-Dist: auth0-python (>=4.1.0,<5.0.0)
15
+ Requires-Dist: boto3 (>=1.33.8,<2.0.0)
15
16
  Requires-Dist: click (>=8.1.3,<9.0.0)
16
17
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
17
18
  Requires-Dist: datadog-api-client (==2.12.0)
@@ -21,7 +22,7 @@ Requires-Dist: grpc-interceptor (>=0.15.0,<0.16.0)
21
22
  Requires-Dist: grpcio (>=1.50.0,<2.0.0)
22
23
  Requires-Dist: httpx (>=0.15.4,<0.25.0)
23
24
  Requires-Dist: importlib-metadata (>=4.4) ; python_version < "3.10"
24
- Requires-Dist: isolate-proto (==0.2.0)
25
+ Requires-Dist: isolate-proto (>=0.2.1,<0.3.0)
25
26
  Requires-Dist: isolate[build] (>=0.12.3,<1.0)
26
27
  Requires-Dist: opentelemetry-api (>=1.15.0,<2.0.0)
27
28
  Requires-Dist: opentelemetry-sdk (>=1.15.0,<2.0.0)
@@ -43,5 +44,41 @@ fal is a serverless Python runtime that lets you run and scale code in the cloud
43
44
 
44
45
  With fal, you can build pipelines, serve ML models and scale them up to many users. You scale down to 0 when you don't use any resources.
45
46
 
46
- Check out to the [docs](https://serverless.fal.ai/docs) for more details.
47
+ ## Quickstart
48
+
49
+ First, you need to install the `fal` package. You can do so using pip:
50
+ ```shell
51
+ pip install fal
52
+ ```
53
+
54
+ Then you need to authenticate:
55
+ ```shell
56
+ fal auth login
57
+ ```
58
+
59
+ You can also use fal keys that you can get from [our dashboard](https://fal.ai/dashboard/keys).
60
+
61
+ Now can use the fal package in your Python scripts as follows:
62
+
63
+ ```py
64
+ import fal
65
+
66
+ @fal.function(
67
+ "virtualenv",
68
+ requirements=["pyjokes"],
69
+ )
70
+ def tell_joke() -> str:
71
+ import pyjokes
72
+
73
+ joke = pyjokes.get_joke()
74
+ return joke
75
+
76
+ print("Joke from the clouds: ", tell_joke())
77
+ ```
78
+
79
+ A new virtual environment will be created by fal in the cloud and the set of requirements that we passed will be installed as soon as this function is called. From that point on, our code will be executed as if it were running locally, and the joke prepared by the pyjokes library will be returned.
80
+
81
+ ## Next steps
82
+
83
+ If you would like to find out more about the capabilities of fal, check out to the [docs](https://fal.ai/docs). You can learn more about persistent storage, function caches and deploying your functions as API endpoints.
47
84
 
@@ -2,35 +2,35 @@ openapi_fal_rest/__init__.py,sha256=sqsyB55QptrijXTCVFQfIJ6uC__vXez1i5KNvYplk5w,
2
2
  openapi_fal_rest/api/__init__.py,sha256=87ApBzKyGb5zsgTMOkQXDqsLZCmaSFoJMwbGzCDQZMw,47
3
3
  openapi_fal_rest/api/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  openapi_fal_rest/api/admin/get_usage_per_user.py,sha256=OcNSsJvq7HGifCmstRgHytY_w_g1uXzkIQr11JpIo-A,5526
5
- openapi_fal_rest/api/admin/handle_user_lock.py,sha256=Ao7QdzH-pnJLBOZrEQH9md_Gy_PbKrIIfJXRDmCUHz8,4847
5
+ openapi_fal_rest/api/admin/handle_user_lock.py,sha256=0wzLd5kk1mHAoFuzkh0MOujI_OkBeeSn_bLQlQZh8fc,4859
6
6
  openapi_fal_rest/api/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  openapi_fal_rest/api/applications/app_metadata.py,sha256=GqG6Q7jt8Jcyhb3ms_6i0M1B3cy205y3_A8W-AGEapY,5120
8
- openapi_fal_rest/api/applications/get_status_applications_app_user_id_app_alias_or_id_status_get.py,sha256=LjByaJtBilaaGuPpU4jbShUTxcd5RW7dxDSs5W8fr3E,4782
8
+ openapi_fal_rest/api/applications/get_status_applications_app_user_id_app_alias_or_id_status_get.py,sha256=a0963hkWscWX1FaAImuOEQTnOWbwakFtlSYZD3JMwAc,4794
9
9
  openapi_fal_rest/api/billing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- openapi_fal_rest/api/billing/delete_payment_method.py,sha256=sZyVmBbZAw5PDKxa0iSRxNSDAIzwNjUKdrYf8xz1fgA,4409
11
- openapi_fal_rest/api/billing/get_setup_intent_key.py,sha256=3qlpnM1LEYK1q8hl8f7EmyBfTM0kWXWC0h5fOS08qzo,3835
10
+ openapi_fal_rest/api/billing/delete_payment_method.py,sha256=2-x2GZrWGaBh_WoMC0xwEPLcv1X0Li11cDoFfHoIvz0,4435
11
+ openapi_fal_rest/api/billing/get_setup_intent_key.py,sha256=4gA_5au8e7SSqPvuFq8_dRxdaUezez0wibUTtewJTXw,3847
12
12
  openapi_fal_rest/api/billing/get_user_details.py,sha256=2HQHRUQj8QwqSKgiV_USBdXCxGlfaVTBbLiPaDsMBUM,4013
13
13
  openapi_fal_rest/api/billing/get_user_invoices.py,sha256=0gvv6QTaiEmN34b9CSFq_cXTjDTPdmbLUzV3UADEw9s,4161
14
14
  openapi_fal_rest/api/billing/get_user_payment_methods.py,sha256=PWgy2dKIxZNI0VFMXPejQyLA1SNvrRjeCsw90TUqduA,4275
15
- openapi_fal_rest/api/billing/get_user_price.py,sha256=422ZOVAqTyNDyK-6V7GW0YnaBIBQeaCz77s0NEthDVA,4952
16
- openapi_fal_rest/api/billing/get_user_spending.py,sha256=uzzchsBblhpUqwOs_zjzRZF_kxyPw9-FfFiPApIRNqE,5730
17
- openapi_fal_rest/api/billing/handle_stripe_webhook.py,sha256=q_sitz9nXFiSYJNV305r1SULTQkLUC6FiI6jIsqwlSQ,5213
18
- openapi_fal_rest/api/billing/upcoming_invoice.py,sha256=5fVCpvoPOFZvl8fAmy3BHrrIDDF0-tPe0AMr_EysweI,3932
19
- openapi_fal_rest/api/billing/update_customer_budget.py,sha256=JnTfj3xcev4ImtbwX_IfolpkmVijPGCgeLMxMrgh7ig,5130
15
+ openapi_fal_rest/api/billing/get_user_price.py,sha256=QN9xNIGdfgxcGWK331Rn23z0jzUjyEzrRHE1-U7z4lg,4964
16
+ openapi_fal_rest/api/billing/get_user_spending.py,sha256=Zy6OqZfHYGyD6F1n9FoIHQI0plBfr7duJr7XlKXrCWA,5742
17
+ openapi_fal_rest/api/billing/handle_stripe_webhook.py,sha256=PfsxfEtJsyurYP6dSrGKEEoz7f-pLd1qlbkh0VsaE8s,5271
18
+ openapi_fal_rest/api/billing/upcoming_invoice.py,sha256=UnRSCmiWjGP7ip8m4lbesC7UVVz8G1z62GKS4MbLprw,3944
19
+ openapi_fal_rest/api/billing/update_customer_budget.py,sha256=-tYslAHac3jsyl6D1uknvYnJyZO-bK20GBnKunuggrc,5142
20
20
  openapi_fal_rest/api/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- openapi_fal_rest/api/files/check_dir_hash.py,sha256=zPNlOwG4YVvnhgfrleQtYLhI1lG0t8YQ1CU3TyvXvfk,4747
22
- openapi_fal_rest/api/files/delete.py,sha256=wiLr0mvwPwVtXsrmvsCBC-dtZjNQEbleETwLwKtIxbg,4096
23
- openapi_fal_rest/api/files/download.py,sha256=LYZXAYjZ3nXFcIp-vphRKHzkmpRz-xTD5QN2FPFtJaE,4090
24
- openapi_fal_rest/api/files/file_exists.py,sha256=dZyDh2JvzRQdnsMeJfegnR7rJshFPHhz4C9F3iklLN8,5098
21
+ openapi_fal_rest/api/files/check_dir_hash.py,sha256=MFQcGLsoR0ez7YwVDuJra5SKCBi7q2JZ2dg-k-nHAaw,4773
22
+ openapi_fal_rest/api/files/delete.py,sha256=B5-GE0j_W_QeE7K0WtWlOEK6jrhlqP0hCTx1xt04_W4,4108
23
+ openapi_fal_rest/api/files/download.py,sha256=KxI1nsT71vYZkcPgDU5Qe3J9SiBBXmxjcUvofqidCsM,4102
24
+ openapi_fal_rest/api/files/file_exists.py,sha256=xewVU3yrR3DnmaapWhIVCyYOFbuXa2fV8FKQKUIYvzk,5110
25
25
  openapi_fal_rest/api/files/list_directory.py,sha256=xFxKuSHKoh3MJW80c2QPKuby_RFJqdI003XuuHw7B3I,4472
26
26
  openapi_fal_rest/api/files/list_root.py,sha256=4S_UF4hNXjrFbenBHQzaDgXQ6WKjmysLqeGe3GR8xXo,4161
27
- openapi_fal_rest/api/files/upload_from_url.py,sha256=OvjrLxbeIoJMvSZ_KHFjM9SF37wUPHlbhepEiUvc55M,4650
28
- openapi_fal_rest/api/files/upload_local_file.py,sha256=p2lM7hswGbs8KNLg1Pp6vwV7x-1PKtWX-aYmaHUHSDU,5649
27
+ openapi_fal_rest/api/files/upload_from_url.py,sha256=EPJciVtnwKGsNXUDnnXf_yUe1Ie90ZqfFuohJB7h14w,4662
28
+ openapi_fal_rest/api/files/upload_local_file.py,sha256=Bbjb-iGatzbmugLt-Bmzdwqx3b8ST1sgbvfO6FKcxcU,5675
29
29
  openapi_fal_rest/api/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  openapi_fal_rest/api/health/check.py,sha256=jX6rC1D_DVRDZqUWCb6zoE1KqQU7Yy0BeUOqfaaLPmQ,3244
31
31
  openapi_fal_rest/api/keys/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- openapi_fal_rest/api/keys/create_key.py,sha256=wVB5yjz0gaDVD6npJc7MKFR5O4PqUy8UEWN5Dws636Y,5096
33
- openapi_fal_rest/api/keys/delete_key.py,sha256=Lnd0of-OQ6o9vswNxrx-8ZzkakWX-PnqlVj2CxESK9s,4016
32
+ openapi_fal_rest/api/keys/create_key.py,sha256=vMrYqJgUtvw3W02wy3tB_NlDCVVdbA_9Rkdp0x1HOD4,5108
33
+ openapi_fal_rest/api/keys/delete_key.py,sha256=AN3uaCZAsNLb0RXQ-oh9pJnprR1-gJuxsa_SyNJoGbE,4028
34
34
  openapi_fal_rest/api/keys/list_keys.py,sha256=HwIf1HHNo52HURkFVNGVIfCJhbtW06iU8VHOLuc92ho,4192
35
35
  openapi_fal_rest/api/logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  openapi_fal_rest/api/logs/list_since.py,sha256=_59g5rX4fZa1YuSXI-Dg_XYldIVAPiGU-pGMbScOPio,6499
@@ -41,28 +41,28 @@ openapi_fal_rest/api/storage/get_file_link.py,sha256=Mvj5vf3XgKBRWfhP5xmzN3dgd7t
41
41
  openapi_fal_rest/api/storage/initiate_upload.py,sha256=CJqfXoj0i4a9Mbs2AyNm4QD1dbEScpWftSa8Lw_lCCs,4688
42
42
  openapi_fal_rest/api/storage/upload_file.py,sha256=e3ipo8LoOihlJDCdBTvNryMxkwb1lwDyj4Stef75gyc,4787
43
43
  openapi_fal_rest/api/tokens/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- openapi_fal_rest/api/tokens/create_token.py,sha256=qjx7nP3jk7n4GkpfnwTUyqZcg8RbhSLm9vIxEZH2IF0,4394
44
+ openapi_fal_rest/api/tokens/create_token.py,sha256=dUl9NrGGyV_4TlkdZ5dJ9H0yieceVblsbnbUKT7o78I,4406
45
45
  openapi_fal_rest/api/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  openapi_fal_rest/api/usage/get_custom_usage_per_machine.py,sha256=okU_8B0a7xHA9ulmgl6WEoVODzz7bOlo4XhBRH6fa5M,6272
47
47
  openapi_fal_rest/api/usage/get_gateway_request_stats.py,sha256=xOJYM0OpRyX_buZJQtXfT2CHLjCb6-yPv7OP7z7kYnk,7614
48
- openapi_fal_rest/api/usage/get_gateway_request_stats_by_time.py,sha256=qqBZRKk8jQRSyn2l0CJz0_9Ecah88mcXtE1mJvRs084,7543
48
+ openapi_fal_rest/api/usage/get_gateway_request_stats_by_time.py,sha256=CB9MGjWcuMWtSIjbkAqjqqpEtxxFlQdWQ3AbsWzEqok,7771
49
49
  openapi_fal_rest/api/usage/get_shared_usage_per_app.py,sha256=tB09GnrwjH81uz-eODTiHl0qNauCR6xj3oa02WEKg4Q,6252
50
50
  openapi_fal_rest/api/usage/get_usage_records.py,sha256=PoRYvdXwEvOYQxVhcqNIplVjPut1yo-9gFwnd47XNMw,8366
51
51
  openapi_fal_rest/api/usage/per_machine_usage.py,sha256=MRMxYP1A-88hFPnEEI0TfCujrsJpaDAlJwue_wCaaGU,6778
52
- openapi_fal_rest/api/usage/per_machine_usage_details.py,sha256=nvXp_Df2KtTDJA4D8KA9NbMY_WIGNn7VLoKQrEPPI9g,4765
52
+ openapi_fal_rest/api/usage/per_machine_usage_details.py,sha256=1trqk3c3NDfUaQvsu-qmeorflPbrSdHuB9CTNpgvM_Q,4779
53
53
  openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
54
54
  openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
55
- openapi_fal_rest/models/__init__.py,sha256=6CLCG50sd_eBvivvI4GUSaApsnJM3vJQ6W8C4Eo-jO8,2931
55
+ openapi_fal_rest/models/__init__.py,sha256=obF7FJiQflc4e5UzkiOCQUfqdLvCFD6zSvE2I2YcJkg,2940
56
56
  openapi_fal_rest/models/app_metadata_response_app_metadata.py,sha256=swJMfWvbjlMF8dmv-KEqcR9If0UjsRogwj9UqBBlkpc,1251
57
57
  openapi_fal_rest/models/body_create_token.py,sha256=GBiwnz4US7VqD7Y6uM4Vy4P89aymRo9etU5WJ1NNl68,1902
58
- openapi_fal_rest/models/body_upload_file.py,sha256=aqOj2Y-ij_tVZa4KC1VqOUrxMyiZLVUKj4XDUvLtGQ0,1854
59
- openapi_fal_rest/models/body_upload_local_file.py,sha256=rOTEbYBXfwZk8TsywZWSPPQQEfJgvsLIufT6A40RJZs,1980
58
+ openapi_fal_rest/models/body_upload_file.py,sha256=QD2KgOE-YYQi3ktU94OMKua2V0NLkxLa01YdVLnty9g,1900
59
+ openapi_fal_rest/models/body_upload_local_file.py,sha256=xaQJwECSFSP_aQyRhGWYpSGGpDjNpn_X7Fa6gdjE0LE,2026
60
60
  openapi_fal_rest/models/customer_details.py,sha256=kJ1_Ayf_Km00eSgQzmaf_dwCL7sr0kIa-08Y9i6bliI,2561
61
61
  openapi_fal_rest/models/file_spec.py,sha256=cd56WUz3VbeBv-1s6YRn7blPQxGyH0SBVlAld7gIWcc,2945
62
62
  openapi_fal_rest/models/gateway_stats_by_time.py,sha256=XcX8C9lh0vn3yEm94umaPVTZKXFUNt3afF1BErHD4mc,3572
63
63
  openapi_fal_rest/models/gateway_usage_stats.py,sha256=OlBVAzkNwy-rtP4-KRfnGHF8eV6K3a1QCJJImhjHSoA,4989
64
- openapi_fal_rest/models/get_gateway_request_stats_by_time_response_get_gateway_request_stats_by_time.py,sha256=V2lHD90uwmyMRWpyG24I5ihQ64KC8YefOMvge15kxcU,2484
65
- openapi_fal_rest/models/grouped_usage_detail.py,sha256=S2YP_SF64mN1lvuD-jScAWKj8CQbuZUN9eBPG0QeDTo,2358
64
+ openapi_fal_rest/models/get_gateway_request_stats_by_time_response_get_gateway_request_stats_by_time.py,sha256=qIf5EVyDLG9YjxC4BWNZm3DHTiNwiq5s4_wN1nUlnKw,2590
65
+ openapi_fal_rest/models/grouped_usage_detail.py,sha256=nKZX50iuqsV2Gey_xwzO5qMzRlqbIzOaN9VC6toF5cc,2388
66
66
  openapi_fal_rest/models/handle_stripe_webhook_response_handle_stripe_webhook.py,sha256=Nsw1G8WDub678G2Rl_AcOLZc6uzhQCJTSox3UFLIbq8,1340
67
67
  openapi_fal_rest/models/hash_check.py,sha256=T9R7n4EdadCxbFUZvresZZFPYwDfyJMZVNxY6wIJEE8,1352
68
68
  openapi_fal_rest/models/http_validation_error.py,sha256=2nhqlv8RX2qp6VR7hb8-SKtzJWXSZ0J95ThW9J4agJo,2131
@@ -93,21 +93,22 @@ openapi_fal_rest/models/user_key_info.py,sha256=4JJ3Bc5YOX--aJgk3PrqPI-TQMXBi8ge
93
93
  openapi_fal_rest/models/validation_error.py,sha256=I6tB-HbEOmE0ua27erDX5PX5YUynENv_dgPN3SrwTrQ,2091
94
94
  openapi_fal_rest/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
95
95
  openapi_fal_rest/types.py,sha256=4xaUIOliefW-5jz_p-JT2LO7-V0wKWaniHGtjPBQfvQ,993
96
- fal/__init__.py,sha256=WE0JWoOFjzLVQPnj4tXRPgH1y5fZW0GLXPGEyORgAFg,1677
96
+ fal/__init__.py,sha256=oBfj8CzfWo-SYWRSEXsJDxCJXPc0ta3t96f1mjgO55o,1075
97
97
  fal/_serialization.py,sha256=GD3iXh-noBr0S33eLRaaj9dupo0OclTiyYPiYIMHBuU,3695
98
- fal/api.py,sha256=mHtmeZcc3eutfPyOWvwH8FUHLZ3fVkjOWRUdELzaU2Q,29660
98
+ fal/api.py,sha256=mqDZ3C88t6JXWCXszV5QBgMVMAg4N5x46wpjZLQi2ys,29797
99
+ fal/app.py,sha256=v2K1-7piOL2poXPy5DBQqSuC4fjlbrSnNqhMBzFWooE,4761
99
100
  fal/apps.py,sha256=j8c4mR-kpRKnZ6wfcuvdgrjuAse7NGD9QR_ZRYan3m4,4121
100
101
  fal/auth/__init__.py,sha256=IzXoOgHaWkZvE2O0JUC9CL18whq8HILFW4oTrcrCJno,2547
101
102
  fal/auth/auth0.py,sha256=qFzCy-n9ptctIu3uj4zbx62WVdjjVw-tQSZEYga9IKY,5302
102
103
  fal/auth/local.py,sha256=lZqp4j32l2xFpY8zYvLoIHHyJrNAJDcm5MxgsLpY_pw,1786
103
- fal/cli.py,sha256=nU71gphhKVH_xJ2Fah49QbS9jE1Mq2xnLDkQo65HlRM,15730
104
+ fal/cli.py,sha256=bbpVDvrMR68T69nvSBSPjbJ7g_PGingwk68omNIO1l0,16899
104
105
  fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
105
106
  fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
106
107
  fal/console/ux.py,sha256=4vj1aGA3grRn-ebeMuDLR6u3YjMwUGpqtNgdTG9su5s,485
107
108
  fal/env.py,sha256=g_s2FAtY2-6zyTar_2NUmswHcab--3xozEJW4E6Y9iQ,172
108
109
  fal/exceptions/__init__.py,sha256=Q4LCSqIrJ8GFQZWH5BvWL5mDPR0HwYQuIhNvsdiOkEU,938
109
- fal/exceptions/_base.py,sha256=eh3u06n4OzaXzwxE5NaZopCfH1X8ia_QQBMou09g-_I,412
110
- fal/exceptions/auth.py,sha256=sknwlBj_tNqnVTZ0XeIv1LHsYA32DH4g3H5xnGmXAk4,342
110
+ fal/exceptions/_base.py,sha256=LeQmx-soL_-s1742WKN18VwTVjUuYP0L0BdQHPJBpM4,460
111
+ fal/exceptions/auth.py,sha256=01Ro7SyGJpwchubdHe14Cl6-Al1jUj16Sy4BvakNWf4,384
111
112
  fal/exceptions/handlers.py,sha256=i_rFyYnfN2p5HmaUGEjxmKqdoixzsMy1tkWdOcqQNL4,1413
112
113
  fal/flags.py,sha256=Ib8cXVzbJZxjSDTYwlBt1brCTD1oqZijexkqZQHRTho,757
113
114
  fal/logging/__init__.py,sha256=tXFlHBtPFydL3Wgzhq72-EzCFKrnDYvZIF0pKYGVxac,1649
@@ -116,22 +117,23 @@ fal/logging/isolate.py,sha256=yDW_P4aR-t53IRmvD2Iprufv1Wn-xQXoBbMB2Ufr59s,2122
116
117
  fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
117
118
  fal/logging/trace.py,sha256=-_ShrBsBl9jUlGC-Lwe2r-LIkfj21SETQAhSNrWxbGs,1807
118
119
  fal/logging/user.py,sha256=paWfeJWlzP3PE1vy7CjUip6hVBT9CKE1AzlSK27KUjA,631
119
- fal/rest_client.py,sha256=Q00SKXxoFal2-_kdVgs7Vb4MarXrHr09_DyLnoFfgWY,567
120
- fal/sdk.py,sha256=7DTnikUbRkNp6YGFNr7NMRrlZo8AWo3LxHpHk1CapIs,16059
121
- fal/sync.py,sha256=exRpYTHoad9oy5aXR6bTztkjmDRdzv_aEp7hD0hRge8,4276
120
+ fal/rest_client.py,sha256=JcvUGAROq0SL0CTCi6PLGeM6qN18YsZK_lU0d6EXdOI,568
121
+ fal/sdk.py,sha256=AXL6wWBS3hO-FNcp4mjAHkcYS_TNo8D2m7JZu4Lbz3E,17099
122
+ fal/sync.py,sha256=6c36Mx3CZAtSbUcjwx4eCgoKtGOTXWmle8G6zFcG35o,4277
122
123
  fal/toolkit/__init__.py,sha256=G0KZVZ0hfBFDGYmv6Giqx_BSg5VD6thck2uH1jR2-h8,367
123
124
  fal/toolkit/exceptions.py,sha256=--WKKYxUop6WFy_vqAPXK6uH8C-JR98gnNXwhHNCb7E,258
124
125
  fal/toolkit/file/__init__.py,sha256=YpUU6YziZV1AMuq12L0EDWToS0sgpHSGWsARbiOEHWk,56
125
- fal/toolkit/file/file.py,sha256=q_hsfOPDwL5EfKr-4oxqLfSs-b5XZH9oOPpysXe35cA,3414
126
+ fal/toolkit/file/file.py,sha256=0RNSJIiTDymxcQ4YnZSGNomIHJnIhO9BEmCY6RO5qGo,3408
126
127
  fal/toolkit/file/providers/fal.py,sha256=u7GQO6UuQNKmwUzHcJePPh6t4Lef_MikW2ogPV5kP0E,2154
127
128
  fal/toolkit/file/providers/gcp.py,sha256=Bq5SJSghXF8YfFnbZ83_mPdrWs2dFhi8ytODp92USgk,1962
128
- fal/toolkit/file/types.py,sha256=bVT6ite0ju7BxN-bO44zqOKSusEdAmLD8LSOQrLdZ_I,1096
129
+ fal/toolkit/file/providers/r2.py,sha256=xJtZfX3cfzJgLXS3F8mHArbrHi0_QBpIMy5M4-tS8H8,2586
130
+ fal/toolkit/file/types.py,sha256=aQMkFialtmoWaJms-rGMiWvX9OE7DtpiT1NX84GPlZs,1102
129
131
  fal/toolkit/image/__init__.py,sha256=liEq0CqkRqUQ1udnnyGVFBwCXUhR2f6o5ffbtbAlP8o,57
130
- fal/toolkit/image/image.py,sha256=wLRqd2Syp5w3zIhpVp9-vQYelbL1CS8wkcMU893E1UA,3588
132
+ fal/toolkit/image/image.py,sha256=zFCGKiGBzdlwq20ISY-olBqUDzUpQ84L5LbLepZteoo,3590
131
133
  fal/toolkit/mainify.py,sha256=E7gE45nZQZoaJdSlIq0mqajcH-IjcuPBWFmKm5hvhAU,406
132
134
  fal/toolkit/utils/__init__.py,sha256=b3zVpm50Upx1saXU7RiV9r9in6-Chs4OU9KRjBv7MYI,83
133
135
  fal/toolkit/utils/download_utils.py,sha256=OlAun9phis7LJtBvVjsQC9sQ6qcZMeZ1_ebdRHm7CLw,13921
134
- fal-0.11.2.dist-info/METADATA,sha256=ZYyg82JNi16PI5iJLARwtuiz-k5awrPmhsQw3hJRgLc,1888
135
- fal-0.11.2.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
136
- fal-0.11.2.dist-info/entry_points.txt,sha256=nE9GBVV3PdBosudFwbIzZQUe_9lfPR6EH8K_FdDASnM,62
137
- fal-0.11.2.dist-info/RECORD,,
136
+ fal-0.11.4.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
137
+ fal-0.11.4.dist-info/entry_points.txt,sha256=nE9GBVV3PdBosudFwbIzZQUe_9lfPR6EH8K_FdDASnM,62
138
+ fal-0.11.4.dist-info/METADATA,sha256=JGab-ufAg6-rP3lg01f3Nfm4-rQoqyPrvouS7AGz8G0,2956
139
+ fal-0.11.4.dist-info/RECORD,,
@@ -38,7 +38,9 @@ def _get_kwargs(
38
38
  }
39
39
 
40
40
 
41
- def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Union[HTTPValidationError, str]]:
41
+ def _parse_response(
42
+ *, client: Client, response: httpx.Response
43
+ ) -> Optional[Union[HTTPValidationError, str]]:
42
44
  if response.status_code == HTTPStatus.OK:
43
45
  response_200 = cast(str, response.json())
44
46
  return response_200
@@ -52,7 +54,9 @@ def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Uni
52
54
  return None
53
55
 
54
56
 
55
- def _build_response(*, client: Client, response: httpx.Response) -> Response[Union[HTTPValidationError, str]]:
57
+ def _build_response(
58
+ *, client: Client, response: httpx.Response
59
+ ) -> Response[Union[HTTPValidationError, str]]:
56
60
  return Response(
57
61
  status_code=HTTPStatus(response.status_code),
58
62
  content=response.content,
@@ -33,7 +33,9 @@ def _get_kwargs(
33
33
  }
34
34
 
35
35
 
36
- def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Union[HTTPValidationError, Status]]:
36
+ def _parse_response(
37
+ *, client: Client, response: httpx.Response
38
+ ) -> Optional[Union[HTTPValidationError, Status]]:
37
39
  if response.status_code == HTTPStatus.OK:
38
40
  response_200 = Status.from_dict(response.json())
39
41
 
@@ -48,7 +50,9 @@ def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Uni
48
50
  return None
49
51
 
50
52
 
51
- def _build_response(*, client: Client, response: httpx.Response) -> Response[Union[HTTPValidationError, Status]]:
53
+ def _build_response(
54
+ *, client: Client, response: httpx.Response
55
+ ) -> Response[Union[HTTPValidationError, Status]]:
52
56
  return Response(
53
57
  status_code=HTTPStatus(response.status_code),
54
58
  content=response.content,
@@ -14,7 +14,9 @@ def _get_kwargs(
14
14
  *,
15
15
  client: Client,
16
16
  ) -> Dict[str, Any]:
17
- url = "{}/billing/payment_methods/{payment_method_id}".format(client.base_url, payment_method_id=payment_method_id)
17
+ url = "{}/billing/payment_methods/{payment_method_id}".format(
18
+ client.base_url, payment_method_id=payment_method_id
19
+ )
18
20
 
19
21
  headers: Dict[str, str] = client.get_headers()
20
22
  cookies: Dict[str, Any] = client.get_cookies()
@@ -29,7 +31,9 @@ def _get_kwargs(
29
31
  }
30
32
 
31
33
 
32
- def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Union[HTTPValidationError, bool]]:
34
+ def _parse_response(
35
+ *, client: Client, response: httpx.Response
36
+ ) -> Optional[Union[HTTPValidationError, bool]]:
33
37
  if response.status_code == HTTPStatus.OK:
34
38
  response_200 = cast(bool, response.json())
35
39
  return response_200
@@ -43,7 +47,9 @@ def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Uni
43
47
  return None
44
48
 
45
49
 
46
- def _build_response(*, client: Client, response: httpx.Response) -> Response[Union[HTTPValidationError, bool]]:
50
+ def _build_response(
51
+ *, client: Client, response: httpx.Response
52
+ ) -> Response[Union[HTTPValidationError, bool]]:
47
53
  return Response(
48
54
  status_code=HTTPStatus(response.status_code),
49
55
  content=response.content,
@@ -28,7 +28,9 @@ def _get_kwargs(
28
28
  }
29
29
 
30
30
 
31
- def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Union[HTTPValidationError, str]]:
31
+ def _parse_response(
32
+ *, client: Client, response: httpx.Response
33
+ ) -> Optional[Union[HTTPValidationError, str]]:
32
34
  if response.status_code == HTTPStatus.OK:
33
35
  response_200 = cast(str, response.json())
34
36
  return response_200
@@ -42,7 +44,9 @@ def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Uni
42
44
  return None
43
45
 
44
46
 
45
- def _build_response(*, client: Client, response: httpx.Response) -> Response[Union[HTTPValidationError, str]]:
47
+ def _build_response(
48
+ *, client: Client, response: httpx.Response
49
+ ) -> Response[Union[HTTPValidationError, str]]:
46
50
  return Response(
47
51
  status_code=HTTPStatus(response.status_code),
48
52
  content=response.content,
@@ -41,7 +41,9 @@ def _get_kwargs(
41
41
  }
42
42
 
43
43
 
44
- def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Union[HTTPValidationError, float]]:
44
+ def _parse_response(
45
+ *, client: Client, response: httpx.Response
46
+ ) -> Optional[Union[HTTPValidationError, float]]:
45
47
  if response.status_code == HTTPStatus.OK:
46
48
  response_200 = cast(float, response.json())
47
49
  return response_200
@@ -55,7 +57,9 @@ def _parse_response(*, client: Client, response: httpx.Response) -> Optional[Uni
55
57
  return None
56
58
 
57
59
 
58
- def _build_response(*, client: Client, response: httpx.Response) -> Response[Union[HTTPValidationError, float]]:
60
+ def _build_response(
61
+ *, client: Client, response: httpx.Response
62
+ ) -> Response[Union[HTTPValidationError, float]]:
59
63
  return Response(
60
64
  status_code=HTTPStatus(response.status_code),
61
65
  content=response.content,