script gen bug - fix parameters input for non task blocks (#3683)

This commit is contained in:
Shuchang Zheng
2025-10-10 12:47:54 -07:00
committed by GitHub
parent ae7785d426
commit 89c712786d
2 changed files with 47 additions and 28 deletions

View File

@@ -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: def _build_code_statement(block: dict[str, Any]) -> cst.SimpleStatementLine:
"""Build a skyvern.run_code statement.""" """Build a skyvern.run_code statement."""
parameters = block.get("parameters", [])
parameter_list = [parameter["key"] for parameter in parameters]
args = [ args = [
cst.Arg( cst.Arg(
keyword=cst.Name("code"), keyword=cst.Name("code"),
@@ -963,7 +966,7 @@ def _build_code_statement(block: dict[str, Any]) -> cst.SimpleStatementLine:
), ),
cst.Arg( cst.Arg(
keyword=cst.Name("parameters"), keyword=cst.Name("parameters"),
value=_value(block.get("parameters", None)), value=_value(parameter_list),
whitespace_after_arg=cst.ParenthesizedWhitespace( whitespace_after_arg=cst.ParenthesizedWhitespace(
indent=True, 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: def _build_file_upload_statement(block: dict[str, Any]) -> cst.SimpleStatementLine:
"""Build a skyvern.upload_file statement.""" """Build a skyvern.upload_file statement."""
parameters = block.get("parameters", [])
parameter_list = [parameter["key"] for parameter in parameters]
args = [ args = [
cst.Arg( cst.Arg(
keyword=cst.Name("label"), keyword=cst.Name("label"),
@@ -996,7 +1002,7 @@ def _build_file_upload_statement(block: dict[str, Any]) -> cst.SimpleStatementLi
), ),
cst.Arg( cst.Arg(
keyword=cst.Name("parameters"), keyword=cst.Name("parameters"),
value=_value(block.get("parameters", None)), value=_value(parameter_list),
whitespace_after_arg=cst.ParenthesizedWhitespace( whitespace_after_arg=cst.ParenthesizedWhitespace(
indent=True, indent=True,
last_line=cst.SimpleWhitespace(INDENT), 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: if block.get("parameters") is not None:
parameters = block.get("parameters", [])
parameter_list = [parameter["key"] for parameter in parameters]
args.append( args.append(
cst.Arg( cst.Arg(
keyword=cst.Name("parameters"), keyword=cst.Name("parameters"),
value=_value(block.get("parameters")), value=_value(parameter_list),
whitespace_after_arg=cst.ParenthesizedWhitespace( whitespace_after_arg=cst.ParenthesizedWhitespace(
indent=True, indent=True,
), ),

View File

@@ -1657,6 +1657,7 @@ class BlockValidationOutput:
context: skyvern_context.SkyvernContext context: skyvern_context.SkyvernContext
label: str label: str
output_parameter: OutputParameter output_parameter: OutputParameter
input_parameters: list[PARAMETER_TYPE]
workflow: Workflow workflow: Workflow
workflow_id: str workflow_id: str
workflow_run_id: str workflow_run_id: str
@@ -1664,7 +1665,9 @@ class BlockValidationOutput:
browser_session_id: str | None = None 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() context = skyvern_context.ensure_context()
workflow_id = context.workflow_id workflow_id = context.workflow_id
workflow_run_id = context.workflow_run_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(), modified_at=datetime.now(),
parameter_type=ParameterType.OUTPUT, 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( return BlockValidationOutput(
context=context, context=context,
label=label, label=label,
output_parameter=output_parameter, output_parameter=output_parameter,
input_parameters=input_parameters,
workflow=workflow, workflow=workflow,
workflow_id=workflow_id, workflow_id=workflow_id,
workflow_run_id=workflow_run_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( async def run_code(
code: str, code: str,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = None,
) -> dict[str, Any]: ) -> 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_block = CodeBlock(
code=code, code=code,
label=block_validation_output.label, label=block_validation_output.label,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
) )
block_result = await code_block.execute_safe( block_result = await code_block.execute_safe(
@@ -1729,7 +1740,7 @@ async def run_code(
async def upload_file( async def upload_file(
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = None,
storage_type: FileStorageType = FileStorageType.S3, storage_type: FileStorageType = FileStorageType.S3,
s3_bucket: str | None = None, s3_bucket: str | None = None,
aws_access_key_id: 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, azure_blob_container_name: str | None = None,
path: str | None = None, path: str | None = 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: if s3_bucket:
s3_bucket = _render_template_with_label(s3_bucket, label) s3_bucket = _render_template_with_label(s3_bucket, label)
if aws_access_key_id: if aws_access_key_id:
@@ -1760,7 +1771,7 @@ async def upload_file(
file_upload_block = FileUploadBlock( file_upload_block = FileUploadBlock(
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
storage_type=FileStorageType(storage_type), storage_type=FileStorageType(storage_type),
s3_bucket=s3_bucket, s3_bucket=s3_bucket,
aws_access_key_id=aws_access_key_id, aws_access_key_id=aws_access_key_id,
@@ -1786,9 +1797,9 @@ async def send_email(
body: str, body: str,
file_attachments: list[str] = [], file_attachments: list[str] = [],
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = 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) sender = _render_template_with_label(sender, label)
if isinstance(recipients, str): if isinstance(recipients, str):
recipients = render_list(_render_template_with_label(recipients, label)) recipients = render_list(_render_template_with_label(recipients, label))
@@ -1813,7 +1824,7 @@ async def send_email(
file_attachments=file_attachments, file_attachments=file_attachments,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
await send_email_block.execute_safe( await send_email_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,
@@ -1827,16 +1838,16 @@ async def parse_pdf(
file_url: str, file_url: str,
schema: dict[str, Any] | None = None, schema: dict[str, Any] | None = None,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = 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_url = _render_template_with_label(file_url, label)
pdf_parser_block = PDFParserBlock( pdf_parser_block = PDFParserBlock(
file_url=file_url, file_url=file_url,
json_schema=schema, json_schema=schema,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
await pdf_parser_block.execute_safe( await pdf_parser_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,
@@ -1851,9 +1862,9 @@ async def parse_file(
file_type: FileType, file_type: FileType,
schema: dict[str, Any] | None = None, schema: dict[str, Any] | None = None,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = 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_url = _render_template_with_label(file_url, label)
file_parser_block = FileParserBlock( file_parser_block = FileParserBlock(
file_url=file_url, file_url=file_url,
@@ -1861,7 +1872,7 @@ async def parse_file(
json_schema=schema, json_schema=schema,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
await file_parser_block.execute_safe( await file_parser_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,
@@ -1879,9 +1890,9 @@ async def http_request(
timeout: int = 30, timeout: int = 30,
follow_redirects: bool = True, follow_redirects: bool = True,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = 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) method = _render_template_with_label(method, label)
url = _render_template_with_label(url, label) url = _render_template_with_label(url, label)
http_request_block = HttpRequestBlock( http_request_block = HttpRequestBlock(
@@ -1893,7 +1904,7 @@ async def http_request(
follow_redirects=follow_redirects, follow_redirects=follow_redirects,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
await http_request_block.execute_safe( await http_request_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,
@@ -1906,15 +1917,15 @@ async def http_request(
async def goto( async def goto(
url: str, url: str,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = 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) url = _render_template_with_label(url, label)
goto_url_block = UrlBlock( goto_url_block = UrlBlock(
url=url, url=url,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
await goto_url_block.execute_safe( await goto_url_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,
@@ -1928,16 +1939,16 @@ async def prompt(
prompt: str, prompt: str,
schema: dict[str, Any] | None = None, schema: dict[str, Any] | None = None,
label: str | None = None, label: str | None = None,
parameters: list[PARAMETER_TYPE] | None = None, parameters: list[str] | None = None,
) -> dict[str, Any] | list | str | 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 = _render_template_with_label(prompt, label)
prompt_block = TextPromptBlock( prompt_block = TextPromptBlock(
prompt=prompt, prompt=prompt,
json_schema=schema, json_schema=schema,
label=block_validation_output.label, label=block_validation_output.label,
output_parameter=block_validation_output.output_parameter, output_parameter=block_validation_output.output_parameter,
parameters=parameters or [], parameters=block_validation_output.input_parameters,
) )
result = await prompt_block.execute_safe( result = await prompt_block.execute_safe(
workflow_run_id=block_validation_output.workflow_run_id, workflow_run_id=block_validation_output.workflow_run_id,