From 472f3128d4c2a7579093dcc298e8903196118466 Mon Sep 17 00:00:00 2001 From: lawyzheng Date: Wed, 27 Nov 2024 15:16:43 +0800 Subject: [PATCH] use jinja template for workflow parameter --- skyvern/forge/sdk/workflow/models/block.py | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/skyvern/forge/sdk/workflow/models/block.py b/skyvern/forge/sdk/workflow/models/block.py index cf9f11903..f785000be 100644 --- a/skyvern/forge/sdk/workflow/models/block.py +++ b/skyvern/forge/sdk/workflow/models/block.py @@ -16,6 +16,7 @@ import filetype import structlog from email_validator import EmailNotValidError, validate_email +from jinja2 import Template from playwright.async_api import Error from pydantic import BaseModel, Field @@ -216,6 +217,15 @@ def get_all_parameters( return parameters + @staticmethod + def format_task_block_parameter_template_from_workflow_run_context( + potential_template: str | None, workflow_run_context: WorkflowRunContext + ) -> str | None: + if not potential_template: + return potential_template + template = Template(potential_template) + return template.render(workflow_run_context.values) + @staticmethod async def get_task_order(workflow_run_id: str, current_retry: int) -> tuple[int, int]: """ @@ -289,6 +299,26 @@ async def execute(self, workflow_run_id: str, **kwargs: dict) -> BlockResult: ) self.download_suffix = download_suffix_parameter_value + self.url = self.format_task_block_parameter_template_from_workflow_run_context(self.url, workflow_run_context) + self.totp_identifier = self.format_task_block_parameter_template_from_workflow_run_context( + self.totp_identifier, workflow_run_context + ) + self.download_suffix = self.format_task_block_parameter_template_from_workflow_run_context( + self.download_suffix, workflow_run_context + ) + self.navigation_goal = self.format_task_block_parameter_template_from_workflow_run_context( + self.navigation_goal, workflow_run_context + ) + self.data_extraction_goal = self.format_task_block_parameter_template_from_workflow_run_context( + self.data_extraction_goal, workflow_run_context + ) + self.complete_criterion = self.format_task_block_parameter_template_from_workflow_run_context( + self.complete_criterion, workflow_run_context + ) + self.terminate_criterion = self.format_task_block_parameter_template_from_workflow_run_context( + self.terminate_criterion, workflow_run_context + ) + # TODO (kerem) we should always retry on terminated. We should make a distinction between retriable and # non-retryable terminations while will_retry: