Workflow query optimization (#4330)
This commit is contained in:
@@ -130,6 +130,8 @@ async def run_sdk_action(
|
|||||||
[],
|
[],
|
||||||
[],
|
[],
|
||||||
[],
|
[],
|
||||||
|
None,
|
||||||
|
workflow,
|
||||||
)
|
)
|
||||||
|
|
||||||
context = skyvern_context.ensure_context()
|
context = skyvern_context.ensure_context()
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ from skyvern.forge.sdk.workflow.models.parameter import (
|
|||||||
from skyvern.utils.strings import generate_random_string
|
from skyvern.utils.strings import generate_random_string
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunParameter
|
from skyvern.forge.sdk.workflow.models.workflow import Workflow, WorkflowRunParameter
|
||||||
|
|
||||||
LOG = structlog.get_logger()
|
LOG = structlog.get_logger()
|
||||||
|
|
||||||
@@ -76,6 +76,7 @@ class WorkflowRunContext:
|
|||||||
| CredentialParameter
|
| CredentialParameter
|
||||||
],
|
],
|
||||||
block_outputs: dict[str, Any] | None = None,
|
block_outputs: dict[str, Any] | None = None,
|
||||||
|
workflow: "Workflow | None" = None,
|
||||||
) -> Self:
|
) -> Self:
|
||||||
# key is label name
|
# key is label name
|
||||||
workflow_run_context = cls(
|
workflow_run_context = cls(
|
||||||
@@ -84,6 +85,7 @@ class WorkflowRunContext:
|
|||||||
workflow_permanent_id=workflow_permanent_id,
|
workflow_permanent_id=workflow_permanent_id,
|
||||||
workflow_run_id=workflow_run_id,
|
workflow_run_id=workflow_run_id,
|
||||||
aws_client=aws_client,
|
aws_client=aws_client,
|
||||||
|
workflow=workflow,
|
||||||
)
|
)
|
||||||
|
|
||||||
workflow_run_context.organization_id = organization.organization_id
|
workflow_run_context.organization_id = organization.organization_id
|
||||||
@@ -161,11 +163,13 @@ class WorkflowRunContext:
|
|||||||
workflow_permanent_id: str,
|
workflow_permanent_id: str,
|
||||||
workflow_run_id: str,
|
workflow_run_id: str,
|
||||||
aws_client: AsyncAWSClient,
|
aws_client: AsyncAWSClient,
|
||||||
|
workflow: "Workflow | None" = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.workflow_title = workflow_title
|
self.workflow_title = workflow_title
|
||||||
self.workflow_id = workflow_id
|
self.workflow_id = workflow_id
|
||||||
self.workflow_permanent_id = workflow_permanent_id
|
self.workflow_permanent_id = workflow_permanent_id
|
||||||
self.workflow_run_id = workflow_run_id
|
self.workflow_run_id = workflow_run_id
|
||||||
|
self.workflow = workflow
|
||||||
self.blocks_metadata: dict[str, BlockMetadata] = {}
|
self.blocks_metadata: dict[str, BlockMetadata] = {}
|
||||||
self.parameters: dict[str, PARAMETER_TYPE] = {}
|
self.parameters: dict[str, PARAMETER_TYPE] = {}
|
||||||
self.values: dict[str, Any] = {}
|
self.values: dict[str, Any] = {}
|
||||||
@@ -175,6 +179,13 @@ class WorkflowRunContext:
|
|||||||
self.include_secrets_in_templates: bool = False
|
self.include_secrets_in_templates: bool = False
|
||||||
self.credential_totp_identifiers: dict[str, str] = {}
|
self.credential_totp_identifiers: dict[str, str] = {}
|
||||||
|
|
||||||
|
def set_workflow(self, workflow: "Workflow") -> None:
|
||||||
|
"""
|
||||||
|
Update the cached workflow object in the context.
|
||||||
|
This is used when the workflow is fetched from the database as a fallback.
|
||||||
|
"""
|
||||||
|
self.workflow = workflow
|
||||||
|
|
||||||
def get_parameter(self, key: str) -> Parameter:
|
def get_parameter(self, key: str) -> Parameter:
|
||||||
return self.parameters[key]
|
return self.parameters[key]
|
||||||
|
|
||||||
@@ -1078,6 +1089,7 @@ class WorkflowContextManager:
|
|||||||
| CredentialParameter
|
| CredentialParameter
|
||||||
],
|
],
|
||||||
block_outputs: dict[str, Any] | None = None,
|
block_outputs: dict[str, Any] | None = None,
|
||||||
|
workflow: "Workflow | None" = None,
|
||||||
) -> WorkflowRunContext:
|
) -> WorkflowRunContext:
|
||||||
workflow_run_context = await WorkflowRunContext.init(
|
workflow_run_context = await WorkflowRunContext.init(
|
||||||
self.aws_client,
|
self.aws_client,
|
||||||
@@ -1091,6 +1103,7 @@ class WorkflowContextManager:
|
|||||||
context_parameters,
|
context_parameters,
|
||||||
secret_parameters,
|
secret_parameters,
|
||||||
block_outputs,
|
block_outputs,
|
||||||
|
workflow,
|
||||||
)
|
)
|
||||||
self.workflow_run_contexts[workflow_run_id] = workflow_run_context
|
self.workflow_run_contexts[workflow_run_id] = workflow_run_context
|
||||||
return workflow_run_context
|
return workflow_run_context
|
||||||
|
|||||||
@@ -626,9 +626,14 @@ class BaseTaskBlock(Block):
|
|||||||
workflow_run_id=workflow_run_id,
|
workflow_run_id=workflow_run_id,
|
||||||
organization_id=organization_id,
|
organization_id=organization_id,
|
||||||
)
|
)
|
||||||
workflow = await app.WORKFLOW_SERVICE.get_workflow_by_permanent_id(
|
# Get workflow from context if available, otherwise query database
|
||||||
workflow_permanent_id=workflow_run.workflow_permanent_id,
|
workflow = workflow_run_context.workflow
|
||||||
)
|
if workflow is None:
|
||||||
|
workflow = await app.WORKFLOW_SERVICE.get_workflow_by_permanent_id(
|
||||||
|
workflow_permanent_id=workflow_run.workflow_permanent_id,
|
||||||
|
)
|
||||||
|
# Cache the workflow back to context for future block executions
|
||||||
|
workflow_run_context.set_workflow(workflow)
|
||||||
# if the task url is parameterized, we need to get the value from the workflow run context
|
# if the task url is parameterized, we need to get the value from the workflow run context
|
||||||
if self.url and workflow_run_context.has_parameter(self.url) and workflow_run_context.has_value(self.url):
|
if self.url and workflow_run_context.has_parameter(self.url) and workflow_run_context.has_value(self.url):
|
||||||
task_url_parameter_value = workflow_run_context.get_value(self.url)
|
task_url_parameter_value = workflow_run_context.get_value(self.url)
|
||||||
|
|||||||
@@ -624,6 +624,7 @@ class WorkflowService:
|
|||||||
context_parameters,
|
context_parameters,
|
||||||
secret_parameters,
|
secret_parameters,
|
||||||
block_outputs,
|
block_outputs,
|
||||||
|
workflow,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.exception(
|
LOG.exception(
|
||||||
|
|||||||
@@ -1096,6 +1096,8 @@ async def _set_up_workflow_context(workflow: Workflow, workflow_run_id: str, org
|
|||||||
workflow_output_parameters,
|
workflow_output_parameters,
|
||||||
[],
|
[],
|
||||||
[],
|
[],
|
||||||
|
None,
|
||||||
|
workflow,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user