diff --git a/skyvern/core/script_generations/generate_script.py b/skyvern/core/script_generations/generate_script.py index 21cd637f..902a60e8 100644 --- a/skyvern/core/script_generations/generate_script.py +++ b/skyvern/core/script_generations/generate_script.py @@ -944,6 +944,9 @@ def _build_goto_statement(block: dict[str, Any], data_variable_name: str | None def _build_code_statement(block: dict[str, Any]) -> cst.SimpleStatementLine: """Build a skyvern.run_code statement.""" + parameters = block.get("parameters", []) + parameter_list = [parameter["key"] for parameter in parameters] + args = [ cst.Arg( keyword=cst.Name("code"), @@ -963,7 +966,7 @@ def _build_code_statement(block: dict[str, Any]) -> cst.SimpleStatementLine: ), cst.Arg( keyword=cst.Name("parameters"), - value=_value(block.get("parameters", None)), + value=_value(parameter_list), whitespace_after_arg=cst.ParenthesizedWhitespace( indent=True, ), @@ -985,6 +988,9 @@ def _build_code_statement(block: dict[str, Any]) -> cst.SimpleStatementLine: def _build_file_upload_statement(block: dict[str, Any]) -> cst.SimpleStatementLine: """Build a skyvern.upload_file statement.""" + parameters = block.get("parameters", []) + parameter_list = [parameter["key"] for parameter in parameters] + args = [ cst.Arg( keyword=cst.Name("label"), @@ -996,7 +1002,7 @@ def _build_file_upload_statement(block: dict[str, Any]) -> cst.SimpleStatementLi ), cst.Arg( keyword=cst.Name("parameters"), - value=_value(block.get("parameters", None)), + value=_value(parameter_list), whitespace_after_arg=cst.ParenthesizedWhitespace( indent=True, last_line=cst.SimpleWhitespace(INDENT), @@ -1289,10 +1295,12 @@ def _build_prompt_statement(block: dict[str, Any]) -> cst.SimpleStatementLine: ) if block.get("parameters") is not None: + parameters = block.get("parameters", []) + parameter_list = [parameter["key"] for parameter in parameters] args.append( cst.Arg( keyword=cst.Name("parameters"), - value=_value(block.get("parameters")), + value=_value(parameter_list), whitespace_after_arg=cst.ParenthesizedWhitespace( indent=True, ), diff --git a/skyvern/services/script_service.py b/skyvern/services/script_service.py index 9ba6250f..262d1617 100644 --- a/skyvern/services/script_service.py +++ b/skyvern/services/script_service.py @@ -1657,6 +1657,7 @@ class BlockValidationOutput: context: skyvern_context.SkyvernContext label: str output_parameter: OutputParameter + input_parameters: list[PARAMETER_TYPE] workflow: Workflow workflow_id: str workflow_run_id: str @@ -1664,7 +1665,9 @@ class BlockValidationOutput: browser_session_id: str | None = None -async def _validate_and_get_output_parameter(label: str | None = None) -> BlockValidationOutput: +async def _validate_and_get_output_parameter( + label: str | None = None, parameter_keys: list[str] | None = None +) -> BlockValidationOutput: context = skyvern_context.ensure_context() workflow_id = context.workflow_id workflow_run_id = context.workflow_run_id @@ -1694,10 +1697,18 @@ async def _validate_and_get_output_parameter(label: str | None = None) -> BlockV modified_at=datetime.now(), parameter_type=ParameterType.OUTPUT, ) + input_parameters = [] + if parameter_keys: + for parameter_key in parameter_keys: + parameter = workflow.get_parameter(parameter_key) + if parameter: + input_parameters.append(parameter) + return BlockValidationOutput( context=context, label=label, output_parameter=output_parameter, + input_parameters=input_parameters, workflow=workflow, workflow_id=workflow_id, workflow_run_id=workflow_run_id, @@ -1709,13 +1720,13 @@ async def _validate_and_get_output_parameter(label: str | None = None) -> BlockV async def run_code( code: str, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> dict[str, Any]: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) code_block = CodeBlock( code=code, label=block_validation_output.label, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, output_parameter=block_validation_output.output_parameter, ) block_result = await code_block.execute_safe( @@ -1729,7 +1740,7 @@ async def run_code( async def upload_file( label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, storage_type: FileStorageType = FileStorageType.S3, s3_bucket: str | None = None, aws_access_key_id: str | None = None, @@ -1740,7 +1751,7 @@ async def upload_file( azure_blob_container_name: str | None = None, path: str | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) if s3_bucket: s3_bucket = _render_template_with_label(s3_bucket, label) if aws_access_key_id: @@ -1760,7 +1771,7 @@ async def upload_file( file_upload_block = FileUploadBlock( label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, storage_type=FileStorageType(storage_type), s3_bucket=s3_bucket, aws_access_key_id=aws_access_key_id, @@ -1786,9 +1797,9 @@ async def send_email( body: str, file_attachments: list[str] = [], label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) sender = _render_template_with_label(sender, label) if isinstance(recipients, str): recipients = render_list(_render_template_with_label(recipients, label)) @@ -1813,7 +1824,7 @@ async def send_email( file_attachments=file_attachments, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) await send_email_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id, @@ -1827,16 +1838,16 @@ async def parse_pdf( file_url: str, schema: dict[str, Any] | None = None, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) file_url = _render_template_with_label(file_url, label) pdf_parser_block = PDFParserBlock( file_url=file_url, json_schema=schema, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) await pdf_parser_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id, @@ -1851,9 +1862,9 @@ async def parse_file( file_type: FileType, schema: dict[str, Any] | None = None, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) file_url = _render_template_with_label(file_url, label) file_parser_block = FileParserBlock( file_url=file_url, @@ -1861,7 +1872,7 @@ async def parse_file( json_schema=schema, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) await file_parser_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id, @@ -1879,9 +1890,9 @@ async def http_request( timeout: int = 30, follow_redirects: bool = True, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) method = _render_template_with_label(method, label) url = _render_template_with_label(url, label) http_request_block = HttpRequestBlock( @@ -1893,7 +1904,7 @@ async def http_request( follow_redirects=follow_redirects, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) await http_request_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id, @@ -1906,15 +1917,15 @@ async def http_request( async def goto( url: str, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) url = _render_template_with_label(url, label) goto_url_block = UrlBlock( url=url, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) await goto_url_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id, @@ -1928,16 +1939,16 @@ async def prompt( prompt: str, schema: dict[str, Any] | None = None, label: str | None = None, - parameters: list[PARAMETER_TYPE] | None = None, + parameters: list[str] | None = None, ) -> dict[str, Any] | list | str | None: - block_validation_output = await _validate_and_get_output_parameter(label) + block_validation_output = await _validate_and_get_output_parameter(label, parameters) prompt = _render_template_with_label(prompt, label) prompt_block = TextPromptBlock( prompt=prompt, json_schema=schema, label=block_validation_output.label, output_parameter=block_validation_output.output_parameter, - parameters=parameters or [], + parameters=block_validation_output.input_parameters, ) result = await prompt_block.execute_safe( workflow_run_id=block_validation_output.workflow_run_id,