From 1d81782b37d7ca989375cb917c4d02e499e27587 Mon Sep 17 00:00:00 2001 From: Shuchang Zheng Date: Sat, 17 May 2025 14:26:18 -0700 Subject: [PATCH] Jon/eval update (#2376) --- skyvern/forge/sdk/db/client.py | 34 +++++++++++++++++++++++++-- skyvern/forge/sdk/workflow/service.py | 13 ++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/skyvern/forge/sdk/db/client.py b/skyvern/forge/sdk/db/client.py index 407981a1..7fc2f2cb 100644 --- a/skyvern/forge/sdk/db/client.py +++ b/skyvern/forge/sdk/db/client.py @@ -1544,25 +1544,55 @@ class AgentDB: raise async def get_workflow_runs( - self, organization_id: str, page: int = 1, page_size: int = 10, status: list[WorkflowRunStatus] | None = None + self, + organization_id: str, + page: int = 1, + page_size: int = 10, + status: list[WorkflowRunStatus] | None = None, + ordering: tuple[str, str] | None = None, ) -> list[WorkflowRun]: try: async with self.Session() as session: db_page = page - 1 # offset logic is 0 based + query = ( 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) + + allowed_ordering_fields = { + "created_at": WorkflowRunModel.created_at, + "status": WorkflowRunModel.status, + } + + field, direction = ("created_at", "desc") + + if ordering and isinstance(ordering, tuple) and len(ordering) == 2: + req_field, req_direction = ordering + if req_field in allowed_ordering_fields and req_direction in ("asc", "desc"): + field, direction = req_field, req_direction + + order_column = allowed_ordering_fields[field] + + if direction == "asc": + query = query.order_by(order_column.asc()) + else: + query = query.order_by(order_column.desc()) + + query = query.limit(page_size).offset(db_page * page_size) + 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 diff --git a/skyvern/forge/sdk/workflow/service.py b/skyvern/forge/sdk/workflow/service.py index 192edd06..ad699a26 100644 --- a/skyvern/forge/sdk/workflow/service.py +++ b/skyvern/forge/sdk/workflow/service.py @@ -671,10 +671,19 @@ class WorkflowService: ) async def get_workflow_runs( - self, organization_id: str, page: int = 1, page_size: int = 10, status: list[WorkflowRunStatus] | None = None + self, + organization_id: str, + page: int = 1, + page_size: int = 10, + status: list[WorkflowRunStatus] | None = None, + ordering: tuple[str, str] | None = None, ) -> list[WorkflowRun]: return await app.DATABASE.get_workflow_runs( - organization_id=organization_id, page=page, page_size=page_size, status=status + organization_id=organization_id, + page=page, + page_size=page_size, + status=status, + ordering=ordering, ) async def get_workflow_runs_count(