diff --git a/skyvern/forge/sdk/db/client.py b/skyvern/forge/sdk/db/client.py index 941e5ce4..0f209516 100644 --- a/skyvern/forge/sdk/db/client.py +++ b/skyvern/forge/sdk/db/client.py @@ -1398,15 +1398,18 @@ class AgentDB: limit = page * page_size - workflow_run_query = select(WorkflowRunModel).filter( - WorkflowRunModel.organization_id == organization_id + workflow_run_query = ( + select(WorkflowRunModel, WorkflowModel.title) + .join(WorkflowModel, WorkflowModel.workflow_id == WorkflowRunModel.workflow_id) + .filter(WorkflowRunModel.organization_id == organization_id) ) if status: workflow_run_query = workflow_run_query.filter(WorkflowRunModel.status.in_(status)) workflow_run_query = workflow_run_query.order_by(WorkflowRunModel.created_at.desc()).limit(limit) - workflow_run_query_result = (await session.scalars(workflow_run_query)).all() + workflow_run_query_result = (await session.execute(workflow_run_query)).all() workflow_runs = [ - convert_to_workflow_run(run, debug_enabled=self.debug_enabled) for run in workflow_run_query_result + convert_to_workflow_run(run, workflow_title=title, debug_enabled=self.debug_enabled) + for run, title in workflow_run_query_result ] task_query = ( @@ -1453,15 +1456,19 @@ class AgentDB: async with self.Session() as session: db_page = page - 1 # offset logic is 0 based query = ( - select(WorkflowRunModel) + select(WorkflowRunModel, WorkflowModel.title) + .join(WorkflowModel, WorkflowModel.workflow_id == WorkflowRunModel.workflow_id) .filter(WorkflowRunModel.organization_id == organization_id) .filter(WorkflowRunModel.parent_workflow_run_id.is_(None)) ) if status: query = query.filter(WorkflowRunModel.status.in_(status)) query = query.order_by(WorkflowRunModel.created_at.desc()).limit(page_size).offset(db_page * page_size) - workflow_runs = (await session.scalars(query)).all() - return [convert_to_workflow_run(run) for run in workflow_runs] + workflow_runs = (await session.execute(query)).all() + return [ + convert_to_workflow_run(run, workflow_title=title, debug_enabled=self.debug_enabled) + for run, title in workflow_runs + ] except SQLAlchemyError: LOG.error("SQLAlchemyError", exc_info=True) raise @@ -1478,15 +1485,21 @@ class AgentDB: async with self.Session() as session: db_page = page - 1 # offset logic is 0 based query = ( - select(WorkflowRunModel) + select(WorkflowRunModel, WorkflowModel.title) + .join(WorkflowModel, WorkflowModel.workflow_id == WorkflowRunModel.workflow_id) .filter(WorkflowRunModel.workflow_permanent_id == workflow_permanent_id) .filter(WorkflowRunModel.organization_id == organization_id) ) if status: query = query.filter(WorkflowRunModel.status.in_(status)) query = query.order_by(WorkflowRunModel.created_at.desc()).limit(page_size).offset(db_page * page_size) - workflow_runs = (await session.scalars(query)).all() - return [convert_to_workflow_run(run) for run in workflow_runs] + workflow_runs_and_titles_tuples = (await session.execute(query)).all() + workflow_runs = [ + convert_to_workflow_run(run, workflow_title=title, debug_enabled=self.debug_enabled) + for run, title in workflow_runs_and_titles_tuples + ] + return workflow_runs + except SQLAlchemyError: LOG.error("SQLAlchemyError", exc_info=True) raise diff --git a/skyvern/forge/sdk/db/utils.py b/skyvern/forge/sdk/db/utils.py index a3e4361a..23aa4081 100644 --- a/skyvern/forge/sdk/db/utils.py +++ b/skyvern/forge/sdk/db/utils.py @@ -192,7 +192,9 @@ def convert_to_workflow(workflow_model: WorkflowModel, debug_enabled: bool = Fal ) -def convert_to_workflow_run(workflow_run_model: WorkflowRunModel, debug_enabled: bool = False) -> WorkflowRun: +def convert_to_workflow_run( + workflow_run_model: WorkflowRunModel, workflow_title: str | None = None, debug_enabled: bool = False +) -> WorkflowRun: if debug_enabled: LOG.debug( "Converting WorkflowRunModel to WorkflowRun", @@ -215,6 +217,7 @@ def convert_to_workflow_run(workflow_run_model: WorkflowRunModel, debug_enabled: totp_identifier=workflow_run_model.totp_identifier, created_at=workflow_run_model.created_at, modified_at=workflow_run_model.modified_at, + workflow_title=workflow_title, ) diff --git a/skyvern/forge/sdk/workflow/models/workflow.py b/skyvern/forge/sdk/workflow/models/workflow.py index 5fcf8e68..31ce84c9 100644 --- a/skyvern/forge/sdk/workflow/models/workflow.py +++ b/skyvern/forge/sdk/workflow/models/workflow.py @@ -109,6 +109,7 @@ class WorkflowRun(BaseModel): totp_identifier: str | None = None failure_reason: str | None = None parent_workflow_run_id: str | None = None + workflow_title: str | None = None created_at: datetime modified_at: datetime @@ -147,3 +148,4 @@ class WorkflowRunStatusResponse(BaseModel): total_steps: int | None = None total_cost: float | None = None observer_task: ObserverTask | None = None + workflow_title: str | None = None diff --git a/skyvern/forge/sdk/workflow/service.py b/skyvern/forge/sdk/workflow/service.py index 55ae4ace..23687b16 100644 --- a/skyvern/forge/sdk/workflow/service.py +++ b/skyvern/forge/sdk/workflow/service.py @@ -1050,6 +1050,7 @@ class WorkflowService: outputs=outputs, total_steps=total_steps, total_cost=total_cost, + workflow_title=workflow.title, ) async def clean_up_workflow(