fal 1.5.9__tar.gz → 1.5.11__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.5.9/fal.egg-info → fal-1.5.11}/PKG-INFO +2 -2
- {fal-1.5.9 → fal-1.5.11/fal.egg-info}/PKG-INFO +2 -2
- {fal-1.5.9 → fal-1.5.11}/fal.egg-info/requires.txt +1 -1
- {fal-1.5.9 → fal-1.5.11}/pyproject.toml +1 -1
- {fal-1.5.9 → fal-1.5.11}/src/fal/_fal_version.py +2 -2
- {fal-1.5.9 → fal-1.5.11}/src/fal/app.py +10 -2
- {fal-1.5.9 → fal-1.5.11}/src/fal/apps.py +4 -2
- {fal-1.5.9 → fal-1.5.11}/src/fal/workflows.py +10 -4
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_deploy.py +2 -2
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_run.py +2 -1
- {fal-1.5.9 → fal-1.5.11}/tests/test_apps.py +8 -7
- {fal-1.5.9 → fal-1.5.11}/.gitignore +0 -0
- {fal-1.5.9 → fal-1.5.11}/Makefile +0 -0
- {fal-1.5.9 → fal-1.5.11}/README.md +0 -0
- {fal-1.5.9 → fal-1.5.11}/docs/conf.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/docs/index.rst +0 -0
- {fal-1.5.9 → fal-1.5.11}/fal.egg-info/SOURCES.txt +0 -0
- {fal-1.5.9 → fal-1.5.11}/fal.egg-info/dependency_links.txt +0 -0
- {fal-1.5.9 → fal-1.5.11}/fal.egg-info/entry_points.txt +0 -0
- {fal-1.5.9 → fal-1.5.11}/fal.egg-info/top_level.txt +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/README.md +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/applications/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/applications/app_metadata.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/billing/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/billing/get_user_details.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/create_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/delete_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/get_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/list_user_workflows.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/comfy/update_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/check_dir_hash.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/files/upload_local_file.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/users/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/users/get_current_user.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/create_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/delete_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/get_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/list_user_workflows.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/api/workflows/update_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/client.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/errors.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/app_metadata_response_app_metadata.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/body_upload_local_file.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_detail.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_item.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_extra_data.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_fal_inputs_dev_info.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/comfy_workflow_schema_prompt.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/current_user.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/customer_details.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/hash_check.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/http_validation_error.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/lock_reason.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/page_comfy_workflow_item.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/page_workflow_item.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/team_role.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_comfy_workflow_update.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/typed_workflow_update.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/user_member.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/validation_error.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_detail_contents.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_item.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_node.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_node_type.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_input.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_schema_output.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/py.typed +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/types.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/pyproject.toml +0 -0
- {fal-1.5.9 → fal-1.5.11}/openapi_rest.config.yaml +0 -0
- {fal-1.5.9 → fal-1.5.11}/setup.cfg +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/__main__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/_serialization.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/_version.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/api.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/auth/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/auth/auth0.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/auth/local.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/_utils.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/apps.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/auth.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/create.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/debug.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/deploy.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/doctor.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/keys.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/main.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/parser.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/run.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/cli/secrets.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/console/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/console/icons.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/console/ux.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/container.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/_base.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/_cuda.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/exceptions/auth.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/files.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/flags.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/logging/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/logging/isolate.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/logging/style.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/logging/trace.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/logging/user.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/py.typed +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/rest_client.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/sdk.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/sync.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/exceptions.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/file.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/fal.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/gcp.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/r2.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/providers/s3.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/file/types.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/image.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/env.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/inference.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/model.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/nsfw_filter/requirements.txt +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/image/safety_checker.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/optimize.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/download_utils.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/toolkit/utils/retry.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/src/fal/utils.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/assets/cat.png +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/cli/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_apps.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_auth.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_keys.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/cli/test_secrets.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/conftest.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/integration_test.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/__init__.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/impl.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/mainify_package/utils.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/mainify_target.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/test_stability.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/toolkit/file_test.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/toolkit/image_test.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tests/toolkit/utils/retry.py +0 -0
- {fal-1.5.9 → fal-1.5.11}/tools/demo_script.py +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.11
|
|
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
8
|
Requires-Dist: isolate[build]<0.15.0,>=0.14.2
|
|
9
|
-
Requires-Dist: isolate-proto
|
|
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
|
|
12
12
|
Requires-Dist: cloudpickle==3.0.0
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fal
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.11
|
|
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
8
|
Requires-Dist: isolate[build]<0.15.0,>=0.14.2
|
|
9
|
-
Requires-Dist: isolate-proto
|
|
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
|
|
12
12
|
Requires-Dist: cloudpickle==3.0.0
|
|
@@ -69,6 +69,12 @@ async def _set_logger_labels(
|
|
|
69
69
|
logger_labels: dict[str, str], channel: async_grpc.Channel
|
|
70
70
|
):
|
|
71
71
|
try:
|
|
72
|
+
import sys
|
|
73
|
+
|
|
74
|
+
# Flush any prints that were buffered before setting the logger labels
|
|
75
|
+
sys.stderr.flush()
|
|
76
|
+
sys.stdout.flush()
|
|
77
|
+
|
|
72
78
|
isolate = definitions.IsolateStub(channel)
|
|
73
79
|
isolate_request = definitions.SetMetadataRequest(
|
|
74
80
|
# TODO: when submit is shipped, get task_id from an env var
|
|
@@ -77,9 +83,11 @@ async def _set_logger_labels(
|
|
|
77
83
|
)
|
|
78
84
|
res = isolate.SetMetadata(isolate_request)
|
|
79
85
|
code = await res.code()
|
|
80
|
-
assert str(code) == "StatusCode.OK"
|
|
86
|
+
assert str(code) == "StatusCode.OK", str(code)
|
|
81
87
|
except BaseException:
|
|
82
|
-
|
|
88
|
+
# NOTE hiding this for now to not print on every request
|
|
89
|
+
# logger.debug("Failed to set logger labels", exc_info=True)
|
|
90
|
+
pass
|
|
83
91
|
|
|
84
92
|
|
|
85
93
|
def wrap_app(cls: type[App], **kwargs) -> fal.api.IsolatedFunction:
|
|
@@ -173,7 +173,8 @@ def submit(app_id: str, arguments: dict[str, Any], *, path: str = "") -> Request
|
|
|
173
173
|
app_id = _backwards_compatible_app_id(app_id)
|
|
174
174
|
url = _QUEUE_URL_FORMAT.format(app_id=app_id)
|
|
175
175
|
if path:
|
|
176
|
-
|
|
176
|
+
_path = path[len("/") :] if path.startswith("/") else path
|
|
177
|
+
url += "/" + _path
|
|
177
178
|
|
|
178
179
|
creds = get_default_credentials()
|
|
179
180
|
|
|
@@ -235,7 +236,8 @@ def _connect(app_id: str, *, path: str = "/realtime") -> Iterator[_RealtimeConne
|
|
|
235
236
|
app_id = _backwards_compatible_app_id(app_id)
|
|
236
237
|
url = _REALTIME_URL_FORMAT.format(app_id=app_id)
|
|
237
238
|
if path:
|
|
238
|
-
|
|
239
|
+
_path = path[len("/") :] if path.startswith("/") else path
|
|
240
|
+
url += "/" + _path
|
|
239
241
|
|
|
240
242
|
creds = get_default_credentials()
|
|
241
243
|
|
|
@@ -5,7 +5,7 @@ import webbrowser
|
|
|
5
5
|
from argparse import ArgumentParser
|
|
6
6
|
from collections import Counter
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
|
-
from typing import Any, Iterator, Union, cast
|
|
8
|
+
from typing import Any, Dict, Iterator, List, Union, cast
|
|
9
9
|
|
|
10
10
|
import graphlib
|
|
11
11
|
import rich
|
|
@@ -21,8 +21,8 @@ from fal import flags
|
|
|
21
21
|
from fal.exceptions import FalServerlessException
|
|
22
22
|
from fal.rest_client import REST_CLIENT
|
|
23
23
|
|
|
24
|
-
JSONType = Union[
|
|
25
|
-
SchemaType =
|
|
24
|
+
JSONType = Union[Dict[str, Any], List[Any], str, int, float, bool, None, "Leaf"]
|
|
25
|
+
SchemaType = Dict[str, Any]
|
|
26
26
|
|
|
27
27
|
VARIABLE_PREFIX = "$"
|
|
28
28
|
INPUT_VARIABLE_NAME = "input"
|
|
@@ -50,7 +50,13 @@ def parse_leaf(raw_leaf: str) -> Leaf:
|
|
|
50
50
|
f"Invalid leaf: {raw_leaf} (must start with a reference)"
|
|
51
51
|
)
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
# remove the $ prefix
|
|
54
|
+
_reference = (
|
|
55
|
+
reference[len(VARIABLE_PREFIX) :]
|
|
56
|
+
if reference.startswith(VARIABLE_PREFIX)
|
|
57
|
+
else reference
|
|
58
|
+
)
|
|
59
|
+
leaf: Leaf = ReferenceLeaf(_reference)
|
|
54
60
|
for raw_part in raw_parts:
|
|
55
61
|
if raw_part.isdigit():
|
|
56
62
|
leaf = IndexLeaf(leaf, int(raw_part))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Optional
|
|
1
|
+
from typing import Optional, Tuple
|
|
2
2
|
from unittest.mock import MagicMock, patch
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
@@ -30,7 +30,7 @@ def mock_parse_pyproject_toml():
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def mock_args(
|
|
33
|
-
app_ref:
|
|
33
|
+
app_ref: Tuple[str, Optional[str]],
|
|
34
34
|
app_name: Optional[str] = None,
|
|
35
35
|
auth: Optional[str] = None,
|
|
36
36
|
strategy: Optional[str] = None,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from typing import Optional, Tuple
|
|
1
2
|
from unittest.mock import MagicMock, patch
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
@@ -34,7 +35,7 @@ def mocked_fal_serverless_host(host):
|
|
|
34
35
|
return mock
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
def mock_args(host, func_ref:
|
|
38
|
+
def mock_args(host, func_ref: Tuple[str, Optional[str]]):
|
|
38
39
|
args = MagicMock()
|
|
39
40
|
args.host = host
|
|
40
41
|
args.func_ref = func_ref
|
|
@@ -5,7 +5,7 @@ import subprocess
|
|
|
5
5
|
import time
|
|
6
6
|
from contextlib import contextmanager, suppress
|
|
7
7
|
from datetime import datetime
|
|
8
|
-
from typing import Generator
|
|
8
|
+
from typing import Generator, List, Tuple
|
|
9
9
|
|
|
10
10
|
import fal
|
|
11
11
|
import fal.api as api
|
|
@@ -92,7 +92,7 @@ def container_addition_app(input: Input) -> Output:
|
|
|
92
92
|
|
|
93
93
|
@fal.function(
|
|
94
94
|
keep_alive=300,
|
|
95
|
-
requirements=["fastapi", "uvicorn", "pydantic==1.10.
|
|
95
|
+
requirements=["fastapi", "uvicorn", "pydantic==1.10.18"],
|
|
96
96
|
machine_type="S",
|
|
97
97
|
max_concurrency=1,
|
|
98
98
|
max_multiplexing=30,
|
|
@@ -224,7 +224,7 @@ class RTOutput(BaseModel):
|
|
|
224
224
|
|
|
225
225
|
|
|
226
226
|
class RTOutputs(BaseModel):
|
|
227
|
-
texts:
|
|
227
|
+
texts: List[str]
|
|
228
228
|
|
|
229
229
|
|
|
230
230
|
class RealtimeApp(fal.App, keep_alive=300, max_concurrency=1):
|
|
@@ -252,7 +252,7 @@ class RealtimeApp(fal.App, keep_alive=300, max_concurrency=1):
|
|
|
252
252
|
|
|
253
253
|
|
|
254
254
|
@pytest.fixture(scope="module")
|
|
255
|
-
def aliased_app() -> Generator[
|
|
255
|
+
def aliased_app() -> Generator[Tuple[str, str], None, None]:
|
|
256
256
|
# Create a temporary app, register it, and return the ID of it.
|
|
257
257
|
|
|
258
258
|
import uuid
|
|
@@ -418,6 +418,7 @@ def test_stateful_app_client(test_stateful_app: str):
|
|
|
418
418
|
assert response["result"] == 0
|
|
419
419
|
|
|
420
420
|
|
|
421
|
+
@pytest.mark.flaky(max_runs=3)
|
|
421
422
|
def test_app_cancellation(test_app: str, test_cancellable_app: str):
|
|
422
423
|
request_handle = apps.submit(
|
|
423
424
|
test_cancellable_app, arguments={"lhs": 1, "rhs": 2, "wait_time": 10}
|
|
@@ -516,7 +517,7 @@ def test_404_response(test_app: str, request: pytest.FixtureRequest):
|
|
|
516
517
|
apps.run(test_app, path="/other", arguments={"lhs": 1, "rhs": 2})
|
|
517
518
|
|
|
518
519
|
|
|
519
|
-
def test_app_deploy_scale(aliased_app:
|
|
520
|
+
def test_app_deploy_scale(aliased_app: Tuple[str, str]):
|
|
520
521
|
import uuid
|
|
521
522
|
from dataclasses import replace
|
|
522
523
|
|
|
@@ -558,7 +559,7 @@ def test_app_deploy_scale(aliased_app: tuple[str, str]):
|
|
|
558
559
|
assert found.max_multiplexing == 30
|
|
559
560
|
|
|
560
561
|
|
|
561
|
-
def test_app_update_app(aliased_app:
|
|
562
|
+
def test_app_update_app(aliased_app: Tuple[str, str]):
|
|
562
563
|
app_revision, app_alias = aliased_app
|
|
563
564
|
|
|
564
565
|
host: api.FalServerlessHost = addition_app.host # type: ignore
|
|
@@ -608,7 +609,7 @@ def test_app_update_app(aliased_app: tuple[str, str]):
|
|
|
608
609
|
assert res.max_multiplexing == new_max_multiplexing
|
|
609
610
|
|
|
610
611
|
|
|
611
|
-
def test_app_set_delete_alias(aliased_app:
|
|
612
|
+
def test_app_set_delete_alias(aliased_app: Tuple[str, str]):
|
|
612
613
|
app_revision, app_alias = aliased_app
|
|
613
614
|
|
|
614
615
|
host: api.FalServerlessHost = addition_app.host # type: ignore
|
|
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
|
{fal-1.5.9 → fal-1.5.11}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fal-1.5.9 → fal-1.5.11}/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.5.9 → fal-1.5.11}/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.5.9 → fal-1.5.11}/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.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_metadata.py
RENAMED
|
File without changes
|
{fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_nodes.py
RENAMED
|
File without changes
|
{fal-1.5.9 → fal-1.5.11}/openapi-fal-rest/openapi_fal_rest/models/workflow_contents_output.py
RENAMED
|
File without changes
|
|
File without changes
|
{fal-1.5.9 → fal-1.5.11}/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
|
|
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
|