add current item in forloop + global forloop reference (#2512)

This commit is contained in:
Shuchang Zheng
2025-05-29 08:12:07 -07:00
committed by GitHub
parent 49ef1aaa07
commit bd72491d7d
4 changed files with 29 additions and 0 deletions

View File

@@ -59,6 +59,7 @@ function header(type: WorkflowEditorParameterType) {
} }
function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) { function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
const reservedKeys = ["current_item", "current_value", "current_index"];
const isCloud = useContext(CloudContext); const isCloud = useContext(CloudContext);
const [key, setKey] = useState(""); const [key, setKey] = useState("");
const [urlParameterKey, setUrlParameterKey] = useState(""); const [urlParameterKey, setUrlParameterKey] = useState("");
@@ -317,6 +318,14 @@ function WorkflowParameterAddPanel({ type, onClose, onSave }: Props) {
}); });
return; return;
} }
if (reservedKeys.includes(key)) {
toast({
variant: "destructive",
title: "Failed to add parameter",
description: `${key} is reserved, please use another key`,
});
return;
}
if (type === "workflow") { if (type === "workflow") {
if ( if (
parameterType === "json" && parameterType === "json" &&

View File

@@ -198,6 +198,15 @@ class Block(BaseModel, abc.ABC):
) )
template_data[self.label] = block_reference_data template_data[self.label] = block_reference_data
# inject the forloop metadata as global variables
if "current_index" in block_reference_data:
template_data["current_index"] = block_reference_data["current_index"]
if "current_item" in block_reference_data:
template_data["current_item"] = block_reference_data["current_item"]
if "current_value" in block_reference_data:
template_data["current_value"] = block_reference_data["current_value"]
return template.render(template_data) return template.render(template_data)
@classmethod @classmethod
@@ -948,7 +957,9 @@ class ForLoopBlock(Block):
metadata: BlockMetadata = { metadata: BlockMetadata = {
"current_index": loop_idx, "current_index": loop_idx,
"current_value": loop_over_value, "current_value": loop_over_value,
"current_item": loop_over_value,
} }
workflow_run_context.update_block_metadata(self.label, metadata)
workflow_run_context.update_block_metadata(loop_block.label, metadata) workflow_run_context.update_block_metadata(loop_block.label, metadata)
original_loop_block = loop_block original_loop_block = loop_block

View File

@@ -8,6 +8,8 @@ from pydantic import BaseModel, ConfigDict, Field
from skyvern.exceptions import InvalidWorkflowParameter from skyvern.exceptions import InvalidWorkflowParameter
RESERVED_PARAMETER_KEYS = ["current_item", "current_value", "current_index"]
class ParameterType(StrEnum): class ParameterType(StrEnum):
WORKFLOW = "workflow" WORKFLOW = "workflow"

View File

@@ -61,6 +61,7 @@ from skyvern.forge.sdk.workflow.models.block import (
) )
from skyvern.forge.sdk.workflow.models.parameter import ( from skyvern.forge.sdk.workflow.models.parameter import (
PARAMETER_TYPE, PARAMETER_TYPE,
RESERVED_PARAMETER_KEYS,
AWSSecretParameter, AWSSecretParameter,
BitwardenCreditCardDataParameter, BitwardenCreditCardDataParameter,
BitwardenLoginCredentialParameter, BitwardenLoginCredentialParameter,
@@ -1450,6 +1451,12 @@ class WorkflowService:
reserved_keys=output_parameter_keys, parameter_keys=parameter_keys reserved_keys=output_parameter_keys, parameter_keys=parameter_keys
) )
if any(key in RESERVED_PARAMETER_KEYS for key in parameter_keys):
raise WorkflowDefinitionHasReservedParameterKeys(
reserved_keys=RESERVED_PARAMETER_KEYS,
parameter_keys=parameter_keys,
)
# Create output parameters for all blocks # Create output parameters for all blocks
block_output_parameters = await WorkflowService._create_all_output_parameters_for_workflow( block_output_parameters = await WorkflowService._create_all_output_parameters_for_workflow(
workflow_id=workflow.workflow_id, workflow_id=workflow.workflow_id,