From 1a3938a7566d1496dbf95381b61e9fb35cd039b0 Mon Sep 17 00:00:00 2001 From: "devsy-bot[bot]" <179624822+devsy-bot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 09:02:23 -0700 Subject: [PATCH] feat: migrate workflow use_cache field to generate_script (#3154) Co-authored-by: devsy-bot Co-authored-by: Shuchang Zheng --- ...e5a8_workflow_use_cache_generate_script.py | 33 +++++++++++++++++++ .../workflows/editor/WorkflowDebugger.tsx | 2 +- .../workflows/editor/WorkflowEditor.tsx | 2 +- .../editor/nodes/StartNode/StartNode.tsx | 6 ++-- .../routes/workflows/types/workflowTypes.ts | 2 +- .../workflows/types/workflowYamlTypes.ts | 2 +- .../src/store/WorkflowHasChangesStore.ts | 2 +- skyvern/forge/sdk/db/client.py | 10 +++--- skyvern/forge/sdk/db/models.py | 2 +- skyvern/forge/sdk/db/utils.py | 2 +- skyvern/forge/sdk/workflow/models/workflow.py | 2 +- skyvern/forge/sdk/workflow/models/yaml.py | 2 +- skyvern/forge/sdk/workflow/service.py | 14 ++++---- 13 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 alembic/versions/2025_08_10_1557-944ef972e5a8_workflow_use_cache_generate_script.py diff --git a/alembic/versions/2025_08_10_1557-944ef972e5a8_workflow_use_cache_generate_script.py b/alembic/versions/2025_08_10_1557-944ef972e5a8_workflow_use_cache_generate_script.py new file mode 100644 index 00000000..966b915a --- /dev/null +++ b/alembic/versions/2025_08_10_1557-944ef972e5a8_workflow_use_cache_generate_script.py @@ -0,0 +1,33 @@ +"""workflow.use_cache -> generate_script + +Revision ID: 944ef972e5a8 +Revises: a027553be970 +Create Date: 2025-08-10 15:57:46.353038+00:00 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "944ef972e5a8" +down_revision: Union[str, None] = "a027553be970" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("workflows", sa.Column("generate_script", sa.Boolean(), nullable=False)) + op.drop_column("workflows", "use_cache") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column("workflows", sa.Column("use_cache", sa.BOOLEAN(), autoincrement=False, nullable=False)) + op.drop_column("workflows", "generate_script") + # ### end Alembic commands ### diff --git a/skyvern-frontend/src/routes/workflows/editor/WorkflowDebugger.tsx b/skyvern-frontend/src/routes/workflows/editor/WorkflowDebugger.tsx index d91cebf1..45d13ec4 100644 --- a/skyvern-frontend/src/routes/workflows/editor/WorkflowDebugger.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/WorkflowDebugger.tsx @@ -170,7 +170,7 @@ function WorkflowDebugger() { extraHttpHeaders: workflow.extra_http_headers ? JSON.stringify(workflow.extra_http_headers) : null, - useScriptCache: workflow.use_cache, + useScriptCache: workflow.generate_script, scriptCacheKey: workflow.cache_key, }; diff --git a/skyvern-frontend/src/routes/workflows/editor/WorkflowEditor.tsx b/skyvern-frontend/src/routes/workflows/editor/WorkflowEditor.tsx index df94c27b..0237f1fb 100644 --- a/skyvern-frontend/src/routes/workflows/editor/WorkflowEditor.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/WorkflowEditor.tsx @@ -56,7 +56,7 @@ function WorkflowEditor() { extraHttpHeaders: workflow.extra_http_headers ? JSON.stringify(workflow.extra_http_headers) : null, - useScriptCache: workflow.use_cache, + useScriptCache: workflow.generate_script, scriptCacheKey: workflow.cache_key, }; diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/StartNode/StartNode.tsx b/skyvern-frontend/src/routes/workflows/editor/nodes/StartNode/StartNode.tsx index 0aef7cf1..81371d28 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/StartNode/StartNode.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/StartNode/StartNode.tsx @@ -137,7 +137,7 @@ function StartNode({ id, data }: NodeProps) {
- + ) {
- - + +
| null; - use_cache?: boolean; + generate_script?: boolean; cache_key?: string | null; }; diff --git a/skyvern-frontend/src/store/WorkflowHasChangesStore.ts b/skyvern-frontend/src/store/WorkflowHasChangesStore.ts index df6cf17c..96ae3445 100644 --- a/skyvern-frontend/src/store/WorkflowHasChangesStore.ts +++ b/skyvern-frontend/src/store/WorkflowHasChangesStore.ts @@ -110,7 +110,7 @@ const useWorkflowSave = () => { max_screenshot_scrolls: saveData.settings.maxScreenshotScrolls, totp_verification_url: saveData.workflow.totp_verification_url, extra_http_headers: extraHttpHeaders, - use_cache: saveData.settings.useScriptCache, + generate_script: saveData.settings.useScriptCache, cache_key: saveData.settings.scriptCacheKey, workflow_definition: { parameters: saveData.parameters, diff --git a/skyvern/forge/sdk/db/client.py b/skyvern/forge/sdk/db/client.py index 32960291..e99d9e34 100644 --- a/skyvern/forge/sdk/db/client.py +++ b/skyvern/forge/sdk/db/client.py @@ -1363,7 +1363,7 @@ class AgentDB: version: int | None = None, is_saved_task: bool = False, status: WorkflowStatus = WorkflowStatus.published, - use_cache: bool = False, + generate_script: bool = False, cache_key: str | None = None, ) -> Workflow: async with self.Session() as session: @@ -1382,7 +1382,7 @@ class AgentDB: model=model, is_saved_task=is_saved_task, status=status, - use_cache=use_cache, + generate_script=generate_script, cache_key=cache_key, ) if workflow_permanent_id: @@ -1562,7 +1562,7 @@ class AgentDB: description: str | None = None, workflow_definition: dict[str, Any] | None = None, version: int | None = None, - use_cache: bool | None = None, + generate_script: bool | None = None, cache_key: str | None = None, ) -> Workflow: try: @@ -1581,8 +1581,8 @@ class AgentDB: workflow.workflow_definition = workflow_definition if version is not None: workflow.version = version - if use_cache is not None: - workflow.use_cache = use_cache + if generate_script is not None: + workflow.generate_script = generate_script if cache_key is not None: workflow.cache_key = cache_key await session.commit() diff --git a/skyvern/forge/sdk/db/models.py b/skyvern/forge/sdk/db/models.py index 804c405b..92764fcb 100644 --- a/skyvern/forge/sdk/db/models.py +++ b/skyvern/forge/sdk/db/models.py @@ -241,7 +241,7 @@ class WorkflowModel(Base): persist_browser_session = Column(Boolean, default=False, nullable=False) model = Column(JSON, nullable=True) status = Column(String, nullable=False, default="published") - use_cache = Column(Boolean, default=False, nullable=False) + generate_script = Column(Boolean, default=False, nullable=False) cache_key = Column(String, nullable=True) created_at = Column(DateTime, default=datetime.datetime.utcnow, nullable=False) diff --git a/skyvern/forge/sdk/db/utils.py b/skyvern/forge/sdk/db/utils.py index 1fc5d452..28cc0875 100644 --- a/skyvern/forge/sdk/db/utils.py +++ b/skyvern/forge/sdk/db/utils.py @@ -262,7 +262,7 @@ def convert_to_workflow(workflow_model: WorkflowModel, debug_enabled: bool = Fal deleted_at=workflow_model.deleted_at, status=WorkflowStatus(workflow_model.status), extra_http_headers=workflow_model.extra_http_headers, - use_cache=workflow_model.use_cache, + generate_script=workflow_model.generate_script, cache_key=workflow_model.cache_key, ) diff --git a/skyvern/forge/sdk/workflow/models/workflow.py b/skyvern/forge/sdk/workflow/models/workflow.py index 22bd7e66..42928e73 100644 --- a/skyvern/forge/sdk/workflow/models/workflow.py +++ b/skyvern/forge/sdk/workflow/models/workflow.py @@ -80,7 +80,7 @@ class Workflow(BaseModel): status: WorkflowStatus = WorkflowStatus.published max_screenshot_scrolls: int | None = None extra_http_headers: dict[str, str] | None = None - use_cache: bool = False + generate_script: bool = False cache_key: str | None = None created_at: datetime diff --git a/skyvern/forge/sdk/workflow/models/yaml.py b/skyvern/forge/sdk/workflow/models/yaml.py index a0e4709c..ab8f6eaf 100644 --- a/skyvern/forge/sdk/workflow/models/yaml.py +++ b/skyvern/forge/sdk/workflow/models/yaml.py @@ -447,5 +447,5 @@ class WorkflowCreateYAMLRequest(BaseModel): max_screenshot_scrolls: int | None = None extra_http_headers: dict[str, str] | None = None status: WorkflowStatus = WorkflowStatus.published - use_cache: bool = False + generate_script: bool = False cache_key: str | None = None diff --git a/skyvern/forge/sdk/workflow/service.py b/skyvern/forge/sdk/workflow/service.py index 04701358..ac7d828f 100644 --- a/skyvern/forge/sdk/workflow/service.py +++ b/skyvern/forge/sdk/workflow/service.py @@ -621,8 +621,8 @@ class WorkflowService: organization_id=organization_id, ) - # TODO: generate script for workflow if the workflow.use_cache is True AND there's no script cached for the workflow - if workflow.use_cache: + # generate script for workflow if the workflow.generate_script is True AND there's no script cached for the workflow + if workflow.generate_script: await self.generate_script_for_workflow(workflow=workflow, workflow_run=workflow_run) return workflow_run @@ -645,7 +645,7 @@ class WorkflowService: is_saved_task: bool = False, status: WorkflowStatus = WorkflowStatus.published, extra_http_headers: dict[str, str] | None = None, - use_cache: bool = False, + generate_script: bool = False, cache_key: str | None = None, ) -> Workflow: return await app.DATABASE.create_workflow( @@ -665,7 +665,7 @@ class WorkflowService: is_saved_task=is_saved_task, status=status, extra_http_headers=extra_http_headers, - use_cache=use_cache, + generate_script=generate_script, cache_key=cache_key, ) @@ -1548,7 +1548,7 @@ class WorkflowService: version=existing_version + 1, is_saved_task=request.is_saved_task, status=request.status, - use_cache=request.use_cache, + generate_script=request.generate_script, cache_key=request.cache_key, ) else: @@ -1567,7 +1567,7 @@ class WorkflowService: extra_http_headers=request.extra_http_headers, is_saved_task=request.is_saved_task, status=request.status, - use_cache=request.use_cache, + generate_script=request.generate_script, cache_key=request.cache_key, ) # Keeping track of the new workflow id to delete it if an error occurs during the creation process @@ -2334,5 +2334,3 @@ class WorkflowService: workflow_id=workflow.workflow_id, workflow_run_id=workflow_run.workflow_run_id, ) - - return