Debugger Continuity (BE) (#3314)
This commit is contained in:
@@ -64,6 +64,7 @@ class WorkflowRunContext:
|
||||
| BitwardenSensitiveInformationParameter
|
||||
| CredentialParameter
|
||||
],
|
||||
block_outputs: dict[str, Any] | None = None,
|
||||
) -> Self:
|
||||
# key is label name
|
||||
workflow_run_context = cls(aws_client=aws_client, azure_client=azure_client)
|
||||
@@ -88,6 +89,10 @@ class WorkflowRunContext:
|
||||
raise OutputParameterKeyCollisionError(output_parameter.key)
|
||||
workflow_run_context.parameters[output_parameter.key] = output_parameter
|
||||
|
||||
if block_outputs:
|
||||
for label, value in block_outputs.items():
|
||||
workflow_run_context.values[f"{label}_output"] = value
|
||||
|
||||
for secrete_parameter in secret_parameters:
|
||||
if isinstance(secrete_parameter, AWSSecretParameter):
|
||||
await workflow_run_context.register_aws_secret_parameter_value(secrete_parameter)
|
||||
@@ -884,6 +889,7 @@ class WorkflowContextManager:
|
||||
| BitwardenCreditCardDataParameter
|
||||
| BitwardenSensitiveInformationParameter
|
||||
],
|
||||
block_outputs: dict[str, Any] | None = None,
|
||||
) -> WorkflowRunContext:
|
||||
workflow_run_context = await WorkflowRunContext.init(
|
||||
self.aws_client,
|
||||
@@ -893,6 +899,7 @@ class WorkflowContextManager:
|
||||
workflow_output_parameters,
|
||||
context_parameters,
|
||||
secret_parameters,
|
||||
block_outputs,
|
||||
)
|
||||
self.workflow_run_contexts[workflow_run_id] = workflow_run_context
|
||||
return workflow_run_context
|
||||
|
||||
@@ -9,6 +9,7 @@ import structlog
|
||||
from jinja2.sandbox import SandboxedEnvironment
|
||||
|
||||
from skyvern import analytics
|
||||
from skyvern.client.types.output_parameter import OutputParameter as BlockOutputParameter
|
||||
from skyvern.config import settings
|
||||
from skyvern.constants import GET_DOWNLOADED_FILES_TIMEOUT, SAVE_DOWNLOADED_FILES_TIMEOUT
|
||||
from skyvern.core.script_generations.generate_script import generate_workflow_script as generate_python_workflow_script
|
||||
@@ -263,6 +264,7 @@ class WorkflowService:
|
||||
api_key: str,
|
||||
organization: Organization,
|
||||
block_labels: list[str] | None = None,
|
||||
block_outputs: dict[str, Any] | None = None,
|
||||
browser_session_id: str | None = None,
|
||||
) -> WorkflowRun:
|
||||
"""Execute a workflow."""
|
||||
@@ -273,6 +275,7 @@ class WorkflowService:
|
||||
organization_id=organization_id,
|
||||
browser_session_id=browser_session_id,
|
||||
block_labels=block_labels,
|
||||
block_outputs=block_outputs,
|
||||
)
|
||||
workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id, organization_id=organization_id)
|
||||
workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id=workflow_run.workflow_permanent_id)
|
||||
@@ -316,6 +319,7 @@ class WorkflowService:
|
||||
workflow_output_parameters,
|
||||
context_parameters,
|
||||
secret_parameters,
|
||||
block_outputs,
|
||||
)
|
||||
except Exception as e:
|
||||
LOG.exception(
|
||||
@@ -375,6 +379,7 @@ class WorkflowService:
|
||||
workflow_run_id=workflow_run.workflow_run_id,
|
||||
block_cnt=len(blocks),
|
||||
block_labels=block_labels,
|
||||
block_outputs=block_outputs,
|
||||
)
|
||||
|
||||
else:
|
||||
@@ -714,6 +719,56 @@ class WorkflowService:
|
||||
|
||||
return workflow
|
||||
|
||||
async def get_block_outputs_for_debug_session(
|
||||
self,
|
||||
workflow_permanent_id: str,
|
||||
user_id: str,
|
||||
organization_id: str,
|
||||
exclude_deleted: bool = True,
|
||||
version: int | None = None,
|
||||
) -> dict[str, dict[str, Any]]:
|
||||
workflow = await app.DATABASE.get_workflow_by_permanent_id(
|
||||
workflow_permanent_id,
|
||||
organization_id=organization_id,
|
||||
version=version,
|
||||
exclude_deleted=exclude_deleted,
|
||||
)
|
||||
|
||||
if not workflow:
|
||||
raise WorkflowNotFound(workflow_permanent_id=workflow_permanent_id, version=version)
|
||||
|
||||
labels_to_outputs: dict[str, BlockOutputParameter] = {}
|
||||
|
||||
for block in workflow.workflow_definition.blocks:
|
||||
label = block.label
|
||||
|
||||
block_run = await app.DATABASE.get_latest_completed_block_run(
|
||||
organization_id=organization_id,
|
||||
user_id=user_id,
|
||||
block_label=label,
|
||||
workflow_permanent_id=workflow_permanent_id,
|
||||
)
|
||||
|
||||
if not block_run:
|
||||
continue
|
||||
|
||||
output_parameter = await app.DATABASE.get_workflow_run_output_parameter_by_id(
|
||||
workflow_run_id=block_run.workflow_run_id, output_parameter_id=block_run.output_parameter_id
|
||||
)
|
||||
|
||||
if not output_parameter:
|
||||
continue
|
||||
|
||||
block_output_parameter = output_parameter.value
|
||||
|
||||
if not isinstance(block_output_parameter, dict):
|
||||
continue
|
||||
|
||||
block_output_parameter["created_at"] = output_parameter.created_at
|
||||
labels_to_outputs[label] = block_output_parameter
|
||||
|
||||
return labels_to_outputs
|
||||
|
||||
async def get_workflows_by_permanent_ids(
|
||||
self,
|
||||
workflow_permanent_ids: list[str],
|
||||
@@ -1773,7 +1828,7 @@ class WorkflowService:
|
||||
raise WorkflowDefinitionHasDuplicateParameterKeys(duplicate_keys=duplicate_parameter_keys)
|
||||
# Create blocks from the request
|
||||
block_label_mapping = {}
|
||||
blocks = []
|
||||
blocks: list[BlockTypeVar] = []
|
||||
for block_yaml in request.workflow_definition.blocks:
|
||||
block = await self.block_yaml_to_block(workflow, block_yaml, parameters)
|
||||
blocks.append(block)
|
||||
|
||||
Reference in New Issue
Block a user