fal 1.2.1__tar.gz → 1.2.2__tar.gz
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-1.2.1 → fal-1.2.2}/PKG-INFO +2 -1
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/PKG-INFO +2 -1
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/SOURCES.txt +1 -0
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/requires.txt +1 -0
- {fal-1.2.1 → fal-1.2.2}/pyproject.toml +1 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/_fal_version.py +2 -2
- {fal-1.2.1 → fal-1.2.2}/src/fal/api.py +3 -1
- {fal-1.2.1 → fal-1.2.2}/src/fal/app.py +2 -1
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/apps.py +4 -2
- fal-1.2.2/src/fal/cli/create.py +26 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/deploy.py +3 -3
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/main.py +2 -2
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/run.py +1 -1
- {fal-1.2.1 → fal-1.2.2}/src/fal/utils.py +8 -4
- {fal-1.2.1 → fal-1.2.2}/tests/test_apps.py +4 -4
- {fal-1.2.1 → fal-1.2.2}/.gitignore +0 -0
- {fal-1.2.1 → fal-1.2.2}/README.md +0 -0
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/dependency_links.txt +0 -0
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/entry_points.txt +0 -0
- {fal-1.2.1 → fal-1.2.2}/fal.egg-info/top_level.txt +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/README.md +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/pyproject.toml +0 -0
- {fal-1.2.1 → fal-1.2.2}/openapi_rest.config.yaml +0 -0
- {fal-1.2.1 → fal-1.2.2}/setup.cfg +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/__main__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/_serialization.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/_version.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/apps.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/auth/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/auth/auth0.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/auth/local.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/auth.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/debug.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/doctor.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/keys.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/parser.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/cli/secrets.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/console/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/console/icons.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/console/ux.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/container.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/exceptions/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/exceptions/_base.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/exceptions/auth.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/flags.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/logging/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/logging/isolate.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/logging/style.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/logging/trace.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/logging/user.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/py.typed +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/rest_client.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/sdk.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/sync.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/exceptions.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/file.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/providers/fal.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/providers/gcp.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/providers/r2.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/file/types.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/image/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/image/image.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/optimize.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/utils/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/toolkit/utils/download_utils.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/src/fal/workflows.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_apps.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_auth.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_deploy.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_keys.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_run.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/cli/test_secrets.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/conftest.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/integration_test.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/mainify_package/__init__.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/mainify_package/impl.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/mainify_package/utils.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/mainify_target.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/test_stability.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/toolkit/file_test.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tests/toolkit/image_test.py +0 -0
- {fal-1.2.1 → fal-1.2.2}/tools/demo_script.py +0 -0
{fal-1.2.1 → fal-1.2.2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
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
|
|
@@ -35,6 +35,7 @@ Requires-Dist: websockets<13,>=12.0
|
|
|
35
35
|
Requires-Dist: pillow<11,>=10.2.0
|
|
36
36
|
Requires-Dist: pyjwt[crypto]<3,>=2.8.0
|
|
37
37
|
Requires-Dist: uvicorn<1,>=0.29.0
|
|
38
|
+
Requires-Dist: cookiecutter
|
|
38
39
|
Provides-Extra: test
|
|
39
40
|
Requires-Dist: pytest<8; extra == "test"
|
|
40
41
|
Requires-Dist: pytest-asyncio; extra == "test"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
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
|
|
@@ -35,6 +35,7 @@ Requires-Dist: websockets<13,>=12.0
|
|
|
35
35
|
Requires-Dist: pillow<11,>=10.2.0
|
|
36
36
|
Requires-Dist: pyjwt[crypto]<3,>=2.8.0
|
|
37
37
|
Requires-Dist: uvicorn<1,>=0.29.0
|
|
38
|
+
Requires-Dist: cookiecutter
|
|
38
39
|
Provides-Extra: test
|
|
39
40
|
Requires-Dist: pytest<8; extra == "test"
|
|
40
41
|
Requires-Dist: pytest-asyncio; extra == "test"
|
|
@@ -1048,7 +1048,9 @@ class BaseServable:
|
|
|
1048
1048
|
from uvicorn import Config
|
|
1049
1049
|
|
|
1050
1050
|
app = self._build_app()
|
|
1051
|
-
server = Server(
|
|
1051
|
+
server = Server(
|
|
1052
|
+
config=Config(app, host="0.0.0.0", port=8080, timeout_keep_alive=300)
|
|
1053
|
+
)
|
|
1052
1054
|
metrics_app = FastAPI()
|
|
1053
1055
|
metrics_app.add_route("/metrics", handle_metrics)
|
|
1054
1056
|
metrics_server = Server(config=Config(metrics_app, host="0.0.0.0", port=9090))
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
import time
|
|
8
8
|
import typing
|
|
9
9
|
from contextlib import asynccontextmanager, contextmanager
|
|
10
|
-
from typing import Any, Callable, ClassVar, TypeVar
|
|
10
|
+
from typing import Any, Callable, ClassVar, Literal, TypeVar
|
|
11
11
|
|
|
12
12
|
import httpx
|
|
13
13
|
from fastapi import FastAPI
|
|
@@ -152,6 +152,7 @@ class App(fal.api.BaseServable):
|
|
|
152
152
|
"keep_alive": 60,
|
|
153
153
|
}
|
|
154
154
|
app_name: ClassVar[str]
|
|
155
|
+
app_auth: ClassVar[Literal["private", "public", "shared"]] = "private"
|
|
155
156
|
|
|
156
157
|
def __init_subclass__(cls, **kwargs):
|
|
157
158
|
app_name = kwargs.pop("name", None) or _to_fal_app_name(cls.__name__)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
from typing import TYPE_CHECKING
|
|
2
4
|
|
|
3
5
|
from .parser import FalClientParser
|
|
@@ -6,7 +8,7 @@ if TYPE_CHECKING:
|
|
|
6
8
|
from fal.sdk import AliasInfo, ApplicationInfo
|
|
7
9
|
|
|
8
10
|
|
|
9
|
-
def _apps_table(apps: list[
|
|
11
|
+
def _apps_table(apps: list[AliasInfo]):
|
|
10
12
|
from rich.table import Table
|
|
11
13
|
|
|
12
14
|
table = Table()
|
|
@@ -56,7 +58,7 @@ def _add_list_parser(subparsers, parents):
|
|
|
56
58
|
parser.set_defaults(func=_list)
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
def _app_rev_table(revs: list[
|
|
61
|
+
def _app_rev_table(revs: list[ApplicationInfo]):
|
|
60
62
|
from rich.table import Table
|
|
61
63
|
|
|
62
64
|
table = Table()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
PROJECT_TYPES = ["app"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def _create_project(project_type: str):
|
|
5
|
+
from cookiecutter.main import cookiecutter
|
|
6
|
+
|
|
7
|
+
cookiecutter("https://github.com/fal-ai/cookiecutter-fal.git")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def add_parser(main_subparsers, parents):
|
|
11
|
+
apps_help = "Create fal applications."
|
|
12
|
+
parser = main_subparsers.add_parser(
|
|
13
|
+
"create",
|
|
14
|
+
description=apps_help,
|
|
15
|
+
help=apps_help,
|
|
16
|
+
parents=parents,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
metavar="project_type",
|
|
21
|
+
choices=PROJECT_TYPES,
|
|
22
|
+
help="Type of project to create.",
|
|
23
|
+
dest="project_type",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
parser.set_defaults(func=_create_project)
|
|
@@ -81,17 +81,18 @@ def _deploy(args):
|
|
|
81
81
|
|
|
82
82
|
user = _get_user()
|
|
83
83
|
host = FalServerlessHost(args.host)
|
|
84
|
-
isolated_function, app_name = load_function_from(
|
|
84
|
+
isolated_function, app_name, app_auth = load_function_from(
|
|
85
85
|
host,
|
|
86
86
|
file_path,
|
|
87
87
|
func_name,
|
|
88
88
|
)
|
|
89
89
|
app_name = args.app_name or app_name
|
|
90
|
+
app_auth = args.auth or app_auth or "private"
|
|
90
91
|
app_id = host.register(
|
|
91
92
|
func=isolated_function.func,
|
|
92
93
|
options=isolated_function.options,
|
|
93
94
|
application_name=app_name,
|
|
94
|
-
application_auth_mode=
|
|
95
|
+
application_auth_mode=app_auth,
|
|
95
96
|
metadata=isolated_function.options.host.get("metadata", {}),
|
|
96
97
|
)
|
|
97
98
|
|
|
@@ -151,7 +152,6 @@ def add_parser(main_subparsers, parents):
|
|
|
151
152
|
parser.add_argument(
|
|
152
153
|
"--auth",
|
|
153
154
|
type=valid_auth_option,
|
|
154
|
-
default="private",
|
|
155
155
|
help="Application authentication mode (private, public).",
|
|
156
156
|
)
|
|
157
157
|
parser.set_defaults(func=_deploy)
|
|
@@ -6,7 +6,7 @@ from fal import __version__
|
|
|
6
6
|
from fal.console import console
|
|
7
7
|
from fal.console.icons import CROSS_ICON
|
|
8
8
|
|
|
9
|
-
from . import apps, auth, deploy, doctor, keys, run, secrets
|
|
9
|
+
from . import apps, auth, create, deploy, doctor, keys, run, secrets
|
|
10
10
|
from .debug import debugtools, get_debug_parser
|
|
11
11
|
from .parser import FalParser, FalParserExit
|
|
12
12
|
|
|
@@ -31,7 +31,7 @@ def _get_main_parser() -> argparse.ArgumentParser:
|
|
|
31
31
|
required=True,
|
|
32
32
|
)
|
|
33
33
|
|
|
34
|
-
for cmd in [auth, apps, deploy, run, keys, secrets, doctor]:
|
|
34
|
+
for cmd in [auth, apps, deploy, run, keys, secrets, doctor, create]:
|
|
35
35
|
cmd.add_parser(subparsers, parents)
|
|
36
36
|
|
|
37
37
|
return parser
|
|
@@ -6,7 +6,7 @@ def _run(args):
|
|
|
6
6
|
from fal.utils import load_function_from
|
|
7
7
|
|
|
8
8
|
host = FalServerlessHost(args.host)
|
|
9
|
-
isolated_function, _ = load_function_from(host, *args.func_ref)
|
|
9
|
+
isolated_function, _, _ = load_function_from(host, *args.func_ref)
|
|
10
10
|
# let our exc handlers handle UserFunctionException
|
|
11
11
|
isolated_function.reraise = False
|
|
12
12
|
isolated_function()
|
|
@@ -10,13 +10,13 @@ def load_function_from(
|
|
|
10
10
|
host: FalServerlessHost,
|
|
11
11
|
file_path: str,
|
|
12
12
|
function_name: str | None = None,
|
|
13
|
-
) -> tuple[IsolatedFunction, str | None]:
|
|
13
|
+
) -> tuple[IsolatedFunction, str | None, str | None]:
|
|
14
14
|
import runpy
|
|
15
15
|
|
|
16
16
|
module = runpy.run_path(file_path)
|
|
17
17
|
if function_name is None:
|
|
18
18
|
fal_objects = {
|
|
19
|
-
|
|
19
|
+
obj_name: obj
|
|
20
20
|
for obj_name, obj in module.items()
|
|
21
21
|
if isinstance(obj, type)
|
|
22
22
|
and issubclass(obj, fal.App)
|
|
@@ -30,9 +30,12 @@ def load_function_from(
|
|
|
30
30
|
"Please specify the name of the app."
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
[(
|
|
33
|
+
[(function_name, obj)] = fal_objects.items()
|
|
34
|
+
app_name = obj.app_name
|
|
35
|
+
app_auth = obj.app_auth
|
|
34
36
|
else:
|
|
35
37
|
app_name = None
|
|
38
|
+
app_auth = None
|
|
36
39
|
|
|
37
40
|
if function_name not in module:
|
|
38
41
|
raise FalServerlessError(f"Function '{function_name}' not found in module")
|
|
@@ -44,10 +47,11 @@ def load_function_from(
|
|
|
44
47
|
target = module[function_name]
|
|
45
48
|
if isinstance(target, type) and issubclass(target, App):
|
|
46
49
|
app_name = target.app_name
|
|
50
|
+
app_auth = target.app_auth
|
|
47
51
|
target = wrap_app(target, host=host)
|
|
48
52
|
|
|
49
53
|
if not isinstance(target, IsolatedFunction):
|
|
50
54
|
raise FalServerlessError(
|
|
51
55
|
f"Function '{function_name}' is not a fal.function or a fal.App"
|
|
52
56
|
)
|
|
53
|
-
return target, app_name
|
|
57
|
+
return target, app_name, app_auth
|
|
@@ -192,7 +192,7 @@ def aliased_app() -> Generator[tuple[str, str], None, None]:
|
|
|
192
192
|
|
|
193
193
|
import uuid
|
|
194
194
|
|
|
195
|
-
app_alias = str(uuid.uuid4())
|
|
195
|
+
app_alias = str(uuid.uuid4()) + "-alias"
|
|
196
196
|
app_revision = addition_app.host.register(
|
|
197
197
|
func=addition_app.func,
|
|
198
198
|
options=addition_app.options,
|
|
@@ -482,15 +482,14 @@ def test_app_set_delete_alias(aliased_app: tuple[str, str]):
|
|
|
482
482
|
assert found.revision == app_revision
|
|
483
483
|
assert found.auth_mode == "private"
|
|
484
484
|
|
|
485
|
-
new_app_alias = f"{app_alias}-new"
|
|
486
485
|
with host._connection as client:
|
|
487
486
|
# Get the registered values
|
|
488
|
-
res = client.create_alias(
|
|
487
|
+
res = client.create_alias(app_alias, app_revision, "public")
|
|
489
488
|
|
|
490
489
|
with host._connection as client:
|
|
491
490
|
# Get the registered values
|
|
492
491
|
res = client.list_aliases()
|
|
493
|
-
found = next(filter(lambda alias: alias.alias ==
|
|
492
|
+
found = next(filter(lambda alias: alias.alias == app_alias, res), None)
|
|
494
493
|
assert found, f"Could not find app {app_alias} in {res}"
|
|
495
494
|
assert found.revision == app_revision
|
|
496
495
|
assert found.auth_mode == "public"
|
|
@@ -506,6 +505,7 @@ def test_app_set_delete_alias(aliased_app: tuple[str, str]):
|
|
|
506
505
|
assert not found, f"Found app {app_alias} in {res} after deletion"
|
|
507
506
|
|
|
508
507
|
|
|
508
|
+
@pytest.mark.flaky(max_runs=3)
|
|
509
509
|
def test_realtime_connection(test_realtime_app):
|
|
510
510
|
response = apps.run(test_realtime_app, arguments={"prompt": "a cat"})
|
|
511
511
|
assert response["text"] == "a cat"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py
RENAMED
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.2.1 → fal-1.2.2}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|