fal 0.12.2__py3-none-any.whl → 0.12.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 (46) hide show
  1. fal/__init__.py +11 -2
  2. fal/api.py +130 -50
  3. fal/app.py +81 -134
  4. fal/apps.py +24 -6
  5. fal/auth/__init__.py +14 -2
  6. fal/auth/auth0.py +34 -25
  7. fal/cli.py +9 -4
  8. fal/env.py +0 -4
  9. fal/flags.py +1 -0
  10. fal/logging/__init__.py +0 -2
  11. fal/logging/trace.py +8 -1
  12. fal/sdk.py +33 -6
  13. fal/toolkit/__init__.py +16 -0
  14. fal/workflows.py +481 -0
  15. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/METADATA +4 -7
  16. fal-0.12.4.dist-info/RECORD +88 -0
  17. openapi_fal_rest/__init__.py +1 -0
  18. openapi_fal_rest/api/workflows/__init__.py +0 -0
  19. openapi_fal_rest/api/workflows/create_or_update_workflow_workflows_post.py +172 -0
  20. openapi_fal_rest/api/workflows/delete_workflow_workflows_user_id_workflow_name_delete.py +175 -0
  21. openapi_fal_rest/api/workflows/execute_workflow_workflows_user_id_workflow_name_post.py +268 -0
  22. openapi_fal_rest/api/workflows/get_workflow_workflows_user_id_workflow_name_get.py +181 -0
  23. openapi_fal_rest/api/workflows/get_workflows_workflows_get.py +189 -0
  24. openapi_fal_rest/models/__init__.py +34 -0
  25. openapi_fal_rest/models/app_metadata_response_app_metadata.py +1 -0
  26. openapi_fal_rest/models/customer_details.py +15 -14
  27. openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_json_body_type_0.py +44 -0
  28. openapi_fal_rest/models/execute_workflow_workflows_user_id_workflow_name_post_response_200_type_0.py +44 -0
  29. openapi_fal_rest/models/page_workflow_item.py +107 -0
  30. openapi_fal_rest/models/typed_workflow.py +85 -0
  31. openapi_fal_rest/models/workflow_contents.py +98 -0
  32. openapi_fal_rest/models/workflow_contents_nodes.py +59 -0
  33. openapi_fal_rest/models/workflow_contents_output.py +44 -0
  34. openapi_fal_rest/models/workflow_detail.py +149 -0
  35. openapi_fal_rest/models/workflow_detail_contents_type_0.py +44 -0
  36. openapi_fal_rest/models/workflow_item.py +80 -0
  37. openapi_fal_rest/models/workflow_node.py +74 -0
  38. openapi_fal_rest/models/workflow_node_type.py +9 -0
  39. openapi_fal_rest/models/workflow_schema.py +73 -0
  40. openapi_fal_rest/models/workflow_schema_input.py +44 -0
  41. openapi_fal_rest/models/workflow_schema_output.py +44 -0
  42. openapi_fal_rest/types.py +1 -0
  43. fal/logging/datadog.py +0 -78
  44. fal-0.12.2.dist-info/RECORD +0 -67
  45. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/WHEEL +0 -0
  46. {fal-0.12.2.dist-info → fal-0.12.4.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,74 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, cast
2
+
3
+ import attr
4
+
5
+ from ..models.workflow_node_type import WorkflowNodeType
6
+
7
+ T = TypeVar("T", bound="WorkflowNode")
8
+
9
+
10
+ @attr.s(auto_attribs=True)
11
+ class WorkflowNode:
12
+ """
13
+ Attributes:
14
+ type (WorkflowNodeType):
15
+ id (str):
16
+ depends (List[str]):
17
+ """
18
+
19
+ type: WorkflowNodeType
20
+ id: str
21
+ depends: List[str]
22
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> Dict[str, Any]:
25
+ type = self.type.value
26
+
27
+ id = self.id
28
+ depends = self.depends
29
+
30
+ field_dict: Dict[str, Any] = {}
31
+ field_dict.update(self.additional_properties)
32
+ field_dict.update(
33
+ {
34
+ "type": type,
35
+ "id": id,
36
+ "depends": depends,
37
+ }
38
+ )
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
44
+ d = src_dict.copy()
45
+ type = WorkflowNodeType(d.pop("type"))
46
+
47
+ id = d.pop("id")
48
+
49
+ depends = cast(List[str], d.pop("depends"))
50
+
51
+ workflow_node = cls(
52
+ type=type,
53
+ id=id,
54
+ depends=depends,
55
+ )
56
+
57
+ workflow_node.additional_properties = d
58
+ return workflow_node
59
+
60
+ @property
61
+ def additional_keys(self) -> List[str]:
62
+ return list(self.additional_properties.keys())
63
+
64
+ def __getitem__(self, key: str) -> Any:
65
+ return self.additional_properties[key]
66
+
67
+ def __setitem__(self, key: str, value: Any) -> None:
68
+ self.additional_properties[key] = value
69
+
70
+ def __delitem__(self, key: str) -> None:
71
+ del self.additional_properties[key]
72
+
73
+ def __contains__(self, key: str) -> bool:
74
+ return key in self.additional_properties
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class WorkflowNodeType(str, Enum):
5
+ DISPLAY = "display"
6
+ RUN = "run"
7
+
8
+ def __str__(self) -> str:
9
+ return str(self.value)
@@ -0,0 +1,73 @@
1
+ from typing import TYPE_CHECKING, Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ if TYPE_CHECKING:
6
+ from ..models.workflow_schema_input import WorkflowSchemaInput
7
+ from ..models.workflow_schema_output import WorkflowSchemaOutput
8
+
9
+
10
+ T = TypeVar("T", bound="WorkflowSchema")
11
+
12
+
13
+ @attr.s(auto_attribs=True)
14
+ class WorkflowSchema:
15
+ """
16
+ Attributes:
17
+ input_ (WorkflowSchemaInput):
18
+ output (WorkflowSchemaOutput):
19
+ """
20
+
21
+ input_: "WorkflowSchemaInput"
22
+ output: "WorkflowSchemaOutput"
23
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
24
+
25
+ def to_dict(self) -> Dict[str, Any]:
26
+ input_ = self.input_.to_dict()
27
+
28
+ output = self.output.to_dict()
29
+
30
+ field_dict: Dict[str, Any] = {}
31
+ field_dict.update(self.additional_properties)
32
+ field_dict.update(
33
+ {
34
+ "input": input_,
35
+ "output": output,
36
+ }
37
+ )
38
+
39
+ return field_dict
40
+
41
+ @classmethod
42
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
43
+ from ..models.workflow_schema_input import WorkflowSchemaInput
44
+ from ..models.workflow_schema_output import WorkflowSchemaOutput
45
+
46
+ d = src_dict.copy()
47
+ input_ = WorkflowSchemaInput.from_dict(d.pop("input"))
48
+
49
+ output = WorkflowSchemaOutput.from_dict(d.pop("output"))
50
+
51
+ workflow_schema = cls(
52
+ input_=input_,
53
+ output=output,
54
+ )
55
+
56
+ workflow_schema.additional_properties = d
57
+ return workflow_schema
58
+
59
+ @property
60
+ def additional_keys(self) -> List[str]:
61
+ return list(self.additional_properties.keys())
62
+
63
+ def __getitem__(self, key: str) -> Any:
64
+ return self.additional_properties[key]
65
+
66
+ def __setitem__(self, key: str, value: Any) -> None:
67
+ self.additional_properties[key] = value
68
+
69
+ def __delitem__(self, key: str) -> None:
70
+ del self.additional_properties[key]
71
+
72
+ def __contains__(self, key: str) -> bool:
73
+ return key in self.additional_properties
@@ -0,0 +1,44 @@
1
+ from typing import Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ T = TypeVar("T", bound="WorkflowSchemaInput")
6
+
7
+
8
+ @attr.s(auto_attribs=True)
9
+ class WorkflowSchemaInput:
10
+ """ """
11
+
12
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
13
+
14
+ def to_dict(self) -> Dict[str, Any]:
15
+
16
+ field_dict: Dict[str, Any] = {}
17
+ field_dict.update(self.additional_properties)
18
+ field_dict.update({})
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
24
+ d = src_dict.copy()
25
+ workflow_schema_input = cls()
26
+
27
+ workflow_schema_input.additional_properties = d
28
+ return workflow_schema_input
29
+
30
+ @property
31
+ def additional_keys(self) -> List[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> Any:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: Any) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,44 @@
1
+ from typing import Any, Dict, List, Type, TypeVar
2
+
3
+ import attr
4
+
5
+ T = TypeVar("T", bound="WorkflowSchemaOutput")
6
+
7
+
8
+ @attr.s(auto_attribs=True)
9
+ class WorkflowSchemaOutput:
10
+ """ """
11
+
12
+ additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
13
+
14
+ def to_dict(self) -> Dict[str, Any]:
15
+
16
+ field_dict: Dict[str, Any] = {}
17
+ field_dict.update(self.additional_properties)
18
+ field_dict.update({})
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
24
+ d = src_dict.copy()
25
+ workflow_schema_output = cls()
26
+
27
+ workflow_schema_output.additional_properties = d
28
+ return workflow_schema_output
29
+
30
+ @property
31
+ def additional_keys(self) -> List[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> Any:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: Any) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
openapi_fal_rest/types.py CHANGED
@@ -1,4 +1,5 @@
1
1
  """ Contains some shared types for properties """
2
+
2
3
  from http import HTTPStatus
3
4
  from typing import BinaryIO, Generic, Literal, MutableMapping, Optional, Tuple, TypeVar
4
5
 
fal/logging/datadog.py DELETED
@@ -1,78 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import sys
4
- import traceback
5
- import warnings
6
-
7
- from datadog_api_client import Configuration, ThreadedApiClient
8
- from datadog_api_client.v2.api.logs_api import LogsApi
9
- from datadog_api_client.v2.model.http_log import HTTPLog
10
- from datadog_api_client.v2.model.http_log_item import HTTPLogItem
11
- from structlog.typing import EventDict, WrappedLogger
12
-
13
- from fal.env import CLI_ENV, DATADOG_API_KEY, DATADOG_APP_KEY
14
- from fal.logging.trace import get_current_span_context
15
-
16
- if sys.version_info >= (3, 10):
17
- import importlib.metadata as importlib_metadata
18
- else:
19
- import importlib_metadata
20
-
21
-
22
- configuration = Configuration()
23
- configuration.api_key["apiKeyAuth"] = DATADOG_API_KEY
24
- configuration.api_key["appKeyAuth"] = DATADOG_APP_KEY
25
-
26
-
27
- def _is_error_level(level: str) -> bool:
28
- return level in ["error", "exception", "critical"]
29
-
30
-
31
- def submit_to_datadog(
32
- logger: WrappedLogger, method_name: str, event_dict: EventDict
33
- ) -> EventDict:
34
- if configuration.api_key["apiKeyAuth"] is None:
35
- return event_dict
36
-
37
- log_data = dict(event_dict)
38
- event = log_data.pop("event")
39
- level = log_data.pop("level")
40
-
41
- current_span = get_current_span_context()
42
- attributes = log_data.copy()
43
- tags: dict[str, str] = {}
44
- if current_span is not None:
45
- tags["invocation_id"] = current_span.invocation_id
46
- attributes["dd.trace_id"] = current_span.trace_id
47
- attributes["dd.span_id"] = current_span.span_id
48
-
49
- stack = None
50
- if _is_error_level(method_name):
51
- attributes["error.message"] = str(event)
52
- attributes["error.kind"] = type(event).__name__
53
- stack = traceback.format_exc()
54
-
55
- ddtags = ",".join([f"{key}:{value}" for (key, value) in tags.items()])
56
- log_item = HTTPLogItem(
57
- message=str(event),
58
- level=level,
59
- hostname="client",
60
- service="fal-serverless-cli",
61
- env=CLI_ENV,
62
- version=importlib_metadata.version("fal"),
63
- ddsource="python",
64
- ddtags=ddtags,
65
- traceback=stack,
66
- **attributes,
67
- )
68
- with ThreadedApiClient(configuration) as api_client:
69
- # Deprecation warning of underlying dependencies should not be shown to users
70
- # TODO enable it only in the prod distribution (better: remove when fixed)
71
- warnings.filterwarnings("ignore", category=DeprecationWarning)
72
-
73
- # TODO improve this - add batching
74
- api_instance = LogsApi(api_client)
75
- _ = api_instance.submit_log(HTTPLog([log_item]))
76
- api_client.close()
77
-
78
- return event_dict
@@ -1,67 +0,0 @@
1
- openapi_fal_rest/__init__.py,sha256=sqsyB55QptrijXTCVFQfIJ6uC__vXez1i5KNvYplk5w,151
2
- openapi_fal_rest/api/__init__.py,sha256=87ApBzKyGb5zsgTMOkQXDqsLZCmaSFoJMwbGzCDQZMw,47
3
- openapi_fal_rest/api/applications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- openapi_fal_rest/api/applications/app_metadata.py,sha256=GqG6Q7jt8Jcyhb3ms_6i0M1B3cy205y3_A8W-AGEapY,5120
5
- openapi_fal_rest/api/billing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- openapi_fal_rest/api/billing/get_user_details.py,sha256=2HQHRUQj8QwqSKgiV_USBdXCxGlfaVTBbLiPaDsMBUM,4013
7
- openapi_fal_rest/api/files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- openapi_fal_rest/api/files/check_dir_hash.py,sha256=zPNlOwG4YVvnhgfrleQtYLhI1lG0t8YQ1CU3TyvXvfk,4747
9
- openapi_fal_rest/api/files/upload_local_file.py,sha256=p2lM7hswGbs8KNLg1Pp6vwV7x-1PKtWX-aYmaHUHSDU,5649
10
- openapi_fal_rest/client.py,sha256=G6BpJg9j7-JsrAUGddYwkzeWRYickBjPdcVgXoPzxuE,2817
11
- openapi_fal_rest/errors.py,sha256=8mXSxdfSGzxT82srdhYbR0fHfgenxJXaUtMkaGgb6iU,470
12
- openapi_fal_rest/models/__init__.py,sha256=u2YVZnZwu9YqDPasBnh9GLVIkEJj4PFCThf97Pblx4o,601
13
- openapi_fal_rest/models/app_metadata_response_app_metadata.py,sha256=swJMfWvbjlMF8dmv-KEqcR9If0UjsRogwj9UqBBlkpc,1251
14
- openapi_fal_rest/models/body_upload_local_file.py,sha256=rOTEbYBXfwZk8TsywZWSPPQQEfJgvsLIufT6A40RJZs,1980
15
- openapi_fal_rest/models/customer_details.py,sha256=XQBaO-A5DI54nCau5ZIR0jhCAmsBJKrtDgApuu6PFrU,3912
16
- openapi_fal_rest/models/hash_check.py,sha256=T9R7n4EdadCxbFUZvresZZFPYwDfyJMZVNxY6wIJEE8,1352
17
- openapi_fal_rest/models/http_validation_error.py,sha256=2nhqlv8RX2qp6VR7hb8-SKtzJWXSZ0J95ThW9J4agJo,2131
18
- openapi_fal_rest/models/lock_reason.py,sha256=3b_foCV6bZKvsbyic3hM1_qzvJk_9ZD_5mS1GzSawdw,703
19
- openapi_fal_rest/models/validation_error.py,sha256=I6tB-HbEOmE0ua27erDX5PX5YUynENv_dgPN3SrwTrQ,2091
20
- openapi_fal_rest/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
21
- openapi_fal_rest/types.py,sha256=4xaUIOliefW-5jz_p-JT2LO7-V0wKWaniHGtjPBQfvQ,993
22
- fal/__init__.py,sha256=--wkZvDt27S2vPi3hk8Nc-XRUl4ac_cB6P_12VSqODw,1085
23
- fal/_serialization.py,sha256=l_dZuSX5BT7SogXw1CalYLfT2H3zy3tfq4y6jHuxZqQ,4201
24
- fal/api.py,sha256=xEVuBRVKac82MgcHUqw10IDHims5fwv6oxqpwAmAx1Q,30353
25
- fal/app.py,sha256=_LFUjrf6K8qYKKpDyfJR2dOFmumJxZTgbOz64Ltea9g,13660
26
- fal/apps.py,sha256=utg7mGvklL1oyUBbuEDDcVN234yDLVseqnY1DJsT8nY,6126
27
- fal/auth/__init__.py,sha256=-s7kogdp3szq_pAxHGkfOQjrSBT1DlBx3X-Ifo_Ne1o,3124
28
- fal/auth/auth0.py,sha256=S7bl0ti1w8t-OaAggju12xx0lOtqkXy_qML7QP0t4uI,5303
29
- fal/auth/local.py,sha256=lZqp4j32l2xFpY8zYvLoIHHyJrNAJDcm5MxgsLpY_pw,1786
30
- fal/cli.py,sha256=dxnsHzsochm-u8oQ3gFy6uVHbllI_14bU54bDpyMOwk,17129
31
- fal/console/__init__.py,sha256=ernZ4bzvvliQh5SmrEqQ7lA5eVcbw6Ra2jalKtA7dxg,132
32
- fal/console/icons.py,sha256=De9MfFaSkO2Lqfne13n3PrYfTXJVIzYZVqYn5BWsdrA,108
33
- fal/console/ux.py,sha256=4vj1aGA3grRn-ebeMuDLR6u3YjMwUGpqtNgdTG9su5s,485
34
- fal/env.py,sha256=g_s2FAtY2-6zyTar_2NUmswHcab--3xozEJW4E6Y9iQ,172
35
- fal/exceptions/__init__.py,sha256=Q4LCSqIrJ8GFQZWH5BvWL5mDPR0HwYQuIhNvsdiOkEU,938
36
- fal/exceptions/_base.py,sha256=LeQmx-soL_-s1742WKN18VwTVjUuYP0L0BdQHPJBpM4,460
37
- fal/exceptions/auth.py,sha256=01Ro7SyGJpwchubdHe14Cl6-Al1jUj16Sy4BvakNWf4,384
38
- fal/exceptions/handlers.py,sha256=b21a8S13euECArjpgm2N69HsShqLYVqAboIeMoWlWA4,1414
39
- fal/flags.py,sha256=8OaKkJg_-UvtyRbZf-rW5ZTW3B1xQpzzXnLRNFB7grA,889
40
- fal/logging/__init__.py,sha256=tXFlHBtPFydL3Wgzhq72-EzCFKrnDYvZIF0pKYGVxac,1649
41
- fal/logging/datadog.py,sha256=pC63CrJLF-bXUaF5RUxkdq9wBgklzrMglcdM9gw7teA,2542
42
- fal/logging/isolate.py,sha256=yDW_P4aR-t53IRmvD2Iprufv1Wn-xQXoBbMB2Ufr59s,2122
43
- fal/logging/style.py,sha256=ckIgHzvF4DShM5kQh8F133X53z_vF46snuDHVmo_h9g,386
44
- fal/logging/trace.py,sha256=-_ShrBsBl9jUlGC-Lwe2r-LIkfj21SETQAhSNrWxbGs,1807
45
- fal/logging/user.py,sha256=A8vbZX9z13TPZEDzvlbvCDDdD0EL1KrCP3qHdrT58-A,632
46
- fal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- fal/rest_client.py,sha256=kGBGmuyHfX1lR910EoKCYPjsyU8MdXawT_cW2q8Sajc,568
48
- fal/sdk.py,sha256=Reo6xTxvDCNEEawl4GUNQi83RQ_g2isuAVhXw7fz9oU,17918
49
- fal/sync.py,sha256=Ljet584PVFz4r888-0bwV1Kio-tTneF_85TnHvBPvJw,4277
50
- fal/toolkit/__init__.py,sha256=uHhoAG9FjLzxkmF-Qo9fxz8lrL9t6GE-3zsa_O4Q9V0,420
51
- fal/toolkit/exceptions.py,sha256=--WKKYxUop6WFy_vqAPXK6uH8C-JR98gnNXwhHNCb7E,258
52
- fal/toolkit/file/__init__.py,sha256=YpUU6YziZV1AMuq12L0EDWToS0sgpHSGWsARbiOEHWk,56
53
- fal/toolkit/file/file.py,sha256=ku4agJiGXU2gdfZmFrU5mDlVsag834zoeskbo-6ErEU,5926
54
- fal/toolkit/file/providers/fal.py,sha256=hO59loXzGP4Vg-Q1FFR56nWbbI6BccJRnFsEI6z6EQE,3404
55
- fal/toolkit/file/providers/gcp.py,sha256=Bq5SJSghXF8YfFnbZ83_mPdrWs2dFhi8ytODp92USgk,1962
56
- fal/toolkit/file/providers/r2.py,sha256=xJtZfX3cfzJgLXS3F8mHArbrHi0_QBpIMy5M4-tS8H8,2586
57
- fal/toolkit/file/types.py,sha256=MTIj6Y_ioL4CiMZXMiqx74vlmUifc3SNvcrWAXQfULE,1109
58
- fal/toolkit/image/__init__.py,sha256=liEq0CqkRqUQ1udnnyGVFBwCXUhR2f6o5ffbtbAlP8o,57
59
- fal/toolkit/image/image.py,sha256=bF1PzO4cJoFGJFpQYeG0sNaGuw3cC1zmobmbZrxbPFY,4339
60
- fal/toolkit/mainify.py,sha256=E7gE45nZQZoaJdSlIq0mqajcH-IjcuPBWFmKm5hvhAU,406
61
- fal/toolkit/optimize.py,sha256=OIhX0T-efRMgUJDpvL0bujdun5SovZgTdKxNOv01b_Y,1394
62
- fal/toolkit/utils/__init__.py,sha256=b3zVpm50Upx1saXU7RiV9r9in6-Chs4OU9KRjBv7MYI,83
63
- fal/toolkit/utils/download_utils.py,sha256=bigcLJjLK1OBAGxpYisJ0-5vcQCh0HAPuCykPrcCNd0,15596
64
- fal-0.12.2.dist-info/WHEEL,sha256=vVCvjcmxuUltf8cYhJ0sJMRDLr1XsPuxEId8YDzbyCY,88
65
- fal-0.12.2.dist-info/METADATA,sha256=56jV53hKxoUJA81vNfeG1AVXiVciOE10nb6nICONR5M,3078
66
- fal-0.12.2.dist-info/entry_points.txt,sha256=nE9GBVV3PdBosudFwbIzZQUe_9lfPR6EH8K_FdDASnM,62
67
- fal-0.12.2.dist-info/RECORD,,
File without changes