workflow run block db + schema transformation code (#1418)

This commit is contained in:
Shuchang Zheng
2024-12-20 07:40:32 -08:00
committed by GitHub
parent a12776e630
commit 8b75586fb1
4 changed files with 96 additions and 1 deletions

View File

@@ -30,6 +30,7 @@ from skyvern.forge.sdk.db.models import (
TOTPCodeModel, TOTPCodeModel,
WorkflowModel, WorkflowModel,
WorkflowParameterModel, WorkflowParameterModel,
WorkflowRunBlockModel,
WorkflowRunModel, WorkflowRunModel,
WorkflowRunOutputParameterModel, WorkflowRunOutputParameterModel,
WorkflowRunParameterModel, WorkflowRunParameterModel,
@@ -48,6 +49,7 @@ from skyvern.forge.sdk.db.utils import (
convert_to_workflow, convert_to_workflow,
convert_to_workflow_parameter, convert_to_workflow_parameter,
convert_to_workflow_run, convert_to_workflow_run,
convert_to_workflow_run_block,
convert_to_workflow_run_output_parameter, convert_to_workflow_run_output_parameter,
convert_to_workflow_run_parameter, convert_to_workflow_run_parameter,
) )
@@ -58,6 +60,8 @@ from skyvern.forge.sdk.schemas.organizations import Organization, OrganizationAu
from skyvern.forge.sdk.schemas.task_generations import TaskGeneration from skyvern.forge.sdk.schemas.task_generations import TaskGeneration
from skyvern.forge.sdk.schemas.tasks import OrderBy, ProxyLocation, SortDirection, Task, TaskStatus from skyvern.forge.sdk.schemas.tasks import OrderBy, ProxyLocation, SortDirection, Task, TaskStatus
from skyvern.forge.sdk.schemas.totp_codes import TOTPCode from skyvern.forge.sdk.schemas.totp_codes import TOTPCode
from skyvern.forge.sdk.schemas.workflow_runs import WorkflowRunBlock
from skyvern.forge.sdk.workflow.models.block import BlockStatus, BlockType
from skyvern.forge.sdk.workflow.models.parameter import ( from skyvern.forge.sdk.workflow.models.parameter import (
AWSSecretParameter, AWSSecretParameter,
BitwardenCreditCardDataParameter, BitwardenCreditCardDataParameter,
@@ -1984,3 +1988,63 @@ class AgentDB:
await session.refresh(observer_cruise) await session.refresh(observer_cruise)
return ObserverCruise.model_validate(observer_cruise) return ObserverCruise.model_validate(observer_cruise)
raise NotFoundError(f"ObserverCruise {observer_cruise_id} not found") raise NotFoundError(f"ObserverCruise {observer_cruise_id} not found")
async def create_workflow_run_block(
self,
workflow_run_id: str,
parent_workflow_run_block_id: str | None = None,
organization_id: str | None = None,
task_id: str | None = None,
label: str | None = None,
block_type: BlockType | None = None,
status: BlockStatus = BlockStatus.running,
output: dict | list | str | None = None,
continue_on_failure: bool = False,
) -> WorkflowRunBlock:
async with self.Session() as session:
new_workflow_run_block = WorkflowRunBlockModel(
workflow_run_id=workflow_run_id,
parent_workflow_run_block_id=parent_workflow_run_block_id,
organization_id=organization_id,
task_id=task_id,
label=label,
block_type=block_type,
status=status,
output=output,
continue_on_failure=continue_on_failure,
)
session.add(new_workflow_run_block)
await session.commit()
await session.refresh(new_workflow_run_block)
task = None
if task_id:
task = await self.get_task(task_id, organization_id=organization_id)
return convert_to_workflow_run_block(new_workflow_run_block, task=task)
async def update_workflow_run_block(
self,
workflow_run_block_id: str,
status: BlockStatus | None = None,
output: dict | list | str | None = None,
) -> WorkflowRunBlock:
async with self.Session() as session:
workflow_run_block = (
await session.scalars(
select(WorkflowRunBlockModel).filter_by(workflow_run_block_id=workflow_run_block_id)
)
).first()
if workflow_run_block:
if status:
workflow_run_block.status = status
if output:
workflow_run_block.output = output
await session.commit()
await session.refresh(workflow_run_block)
else:
raise NotFoundError(f"WorkflowRunBlock {workflow_run_block_id} not found")
task = None
task_id = workflow_run_block.task_id
if task_id:
task = await self.get_task(task_id, organization_id=workflow_run_block.organization_id)
return convert_to_workflow_run_block(workflow_run_block, task=task)

View File

@@ -18,6 +18,7 @@ from skyvern.forge.sdk.db.models import (
TaskModel, TaskModel,
WorkflowModel, WorkflowModel,
WorkflowParameterModel, WorkflowParameterModel,
WorkflowRunBlockModel,
WorkflowRunModel, WorkflowRunModel,
WorkflowRunOutputParameterModel, WorkflowRunOutputParameterModel,
WorkflowRunParameterModel, WorkflowRunParameterModel,
@@ -25,6 +26,8 @@ from skyvern.forge.sdk.db.models import (
from skyvern.forge.sdk.models import Step, StepStatus from skyvern.forge.sdk.models import Step, StepStatus
from skyvern.forge.sdk.schemas.organizations import Organization, OrganizationAuthToken from skyvern.forge.sdk.schemas.organizations import Organization, OrganizationAuthToken
from skyvern.forge.sdk.schemas.tasks import ProxyLocation, Task, TaskStatus from skyvern.forge.sdk.schemas.tasks import ProxyLocation, Task, TaskStatus
from skyvern.forge.sdk.schemas.workflow_runs import WorkflowRunBlock
from skyvern.forge.sdk.workflow.models.block import BlockStatus, BlockType
from skyvern.forge.sdk.workflow.models.parameter import ( from skyvern.forge.sdk.workflow.models.parameter import (
AWSSecretParameter, AWSSecretParameter,
BitwardenLoginCredentialParameter, BitwardenLoginCredentialParameter,
@@ -368,3 +371,31 @@ def convert_to_workflow_run_parameter(
value=workflow_parameter.workflow_parameter_type.convert_value(workflow_run_parameter_model.value), value=workflow_parameter.workflow_parameter_type.convert_value(workflow_run_parameter_model.value),
created_at=workflow_run_parameter_model.created_at, created_at=workflow_run_parameter_model.created_at,
) )
def convert_to_workflow_run_block(
workflow_run_block_model: WorkflowRunBlockModel,
task: Task | None = None,
) -> WorkflowRunBlock:
block = WorkflowRunBlock(
workflow_run_block_id=workflow_run_block_model.workflow_run_block_id,
workflow_run_id=workflow_run_block_model.workflow_run_id,
parent_workflow_run_block_id=workflow_run_block_model.parent_workflow_run_block_id,
block_type=BlockType(workflow_run_block_model.block_type),
label=workflow_run_block_model.label,
status=BlockStatus(workflow_run_block_model.status),
output=workflow_run_block_model.output,
continue_on_failure=workflow_run_block_model.continue_on_failure,
task_id=workflow_run_block_model.task_id,
created_at=workflow_run_block_model.created_at,
modified_at=workflow_run_block_model.modified_at,
)
if task:
block.url = task.url
block.navigation_goal = task.navigation_goal
block.data_extraction_goal = task.data_extraction_goal
block.data_schema = task.extracted_information_schema
block.terminate_criterion = task.terminate_criterion
block.complete_criterion = task.complete_criterion
return block

View File

@@ -15,7 +15,6 @@ class WorkflowRunBlock(BaseModel):
parent_workflow_run_block_id: str | None = None parent_workflow_run_block_id: str | None = None
block_type: BlockType block_type: BlockType
label: str | None = None label: str | None = None
title: str | None = None
status: str | None = None status: str | None = None
output: dict | list | str | None = None output: dict | list | str | None = None
continue_on_failure: bool = False continue_on_failure: bool = False

View File

@@ -84,6 +84,7 @@ class BlockType(StrEnum):
class BlockStatus(StrEnum): class BlockStatus(StrEnum):
running = "running"
completed = "completed" completed = "completed"
failed = "failed" failed = "failed"
terminated = "terminated" terminated = "terminated"