API + SDK support - get workflow run (#2324)
Some checks are pending
Run tests and pre-commit / test (push) Waiting to run
Run tests and pre-commit / fe-lint-build (push) Waiting to run
Publish Fern Docs / run (push) Waiting to run
Sync to skyvern-cloud / sync (push) Waiting to run

This commit is contained in:
Shuchang Zheng 2025-05-11 16:24:31 -07:00 committed by GitHub
parent 2c58e99b55
commit 8f37625f51
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 44 additions and 14 deletions

View file

@ -1683,6 +1683,7 @@ async def run_workflow(
run_request=workflow_run_request, run_request=workflow_run_request,
downloaded_files=None, downloaded_files=None,
recording_url=None, recording_url=None,
app_url=f"{settings.SKYVERN_APP_URL.rstrip('/')}/{workflow_run.workflow_permanent_id}/{workflow_run.workflow_run_id}",
) )

View file

@ -969,7 +969,7 @@ class WorkflowService:
async def build_workflow_run_status_response_by_workflow_id( async def build_workflow_run_status_response_by_workflow_id(
self, self,
workflow_run_id: str, workflow_run_id: str,
organization_id: str, organization_id: str | None = None,
include_cost: bool = False, include_cost: bool = False,
) -> WorkflowRunResponseBase: ) -> WorkflowRunResponseBase:
workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id, organization_id=organization_id) workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id, organization_id=organization_id)
@ -988,7 +988,7 @@ class WorkflowService:
self, self,
workflow_permanent_id: str, workflow_permanent_id: str,
workflow_run_id: str, workflow_run_id: str,
organization_id: str, organization_id: str | None = None,
include_cost: bool = False, include_cost: bool = False,
) -> WorkflowRunResponseBase: ) -> WorkflowRunResponseBase:
workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id) workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id)

View file

@ -6,7 +6,7 @@ from skyvern.forge import app
from skyvern.forge.sdk.schemas.tasks import TaskStatus from skyvern.forge.sdk.schemas.tasks import TaskStatus
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunStatus from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunStatus
from skyvern.schemas.runs import RunEngine, RunResponse, RunType, TaskRunRequest, TaskRunResponse from skyvern.schemas.runs import RunEngine, RunResponse, RunType, TaskRunRequest, TaskRunResponse
from skyvern.services import task_v2_service from skyvern.services import task_v2_service, workflow_service
async def get_run_response(run_id: str, organization_id: str | None = None) -> RunResponse | None: async def get_run_response(run_id: str, organization_id: str | None = None) -> RunResponse | None:
@ -79,16 +79,7 @@ async def get_run_response(run_id: str, organization_id: str | None = None) -> R
), ),
) )
elif run.task_run_type == RunType.workflow_run: elif run.task_run_type == RunType.workflow_run:
raise NotImplementedError("Workflow run response not implemented") return await workflow_service.get_workflow_run_response(run.run_id, organization_id=organization_id)
# return WorkflowRunResponse(
# run_id=run.run_id,
# run_type=run.task_run_type,
# status=run.status,
# output=run.output,
# parameters=None,
# created_at=run.created_at,
# modified_at=run.modified_at,
# )
raise ValueError(f"Invalid task run type: {run.task_run_type}") raise ValueError(f"Invalid task run type: {run.task_run_type}")

View file

@ -1,12 +1,13 @@
import structlog import structlog
from fastapi import BackgroundTasks, Request from fastapi import BackgroundTasks, Request
from skyvern.config import settings
from skyvern.forge import app from skyvern.forge import app
from skyvern.forge.sdk.executor.factory import AsyncExecutorFactory from skyvern.forge.sdk.executor.factory import AsyncExecutorFactory
from skyvern.forge.sdk.schemas.organizations import Organization from skyvern.forge.sdk.schemas.organizations import Organization
from skyvern.forge.sdk.workflow.exceptions import InvalidTemplateWorkflowPermanentId from skyvern.forge.sdk.workflow.exceptions import InvalidTemplateWorkflowPermanentId
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRequestBody, WorkflowRun from skyvern.forge.sdk.workflow.models.workflow import WorkflowRequestBody, WorkflowRun
from skyvern.schemas.runs import RunType from skyvern.schemas.runs import RunStatus, RunType, WorkflowRunRequest, WorkflowRunResponse
LOG = structlog.get_logger(__name__) LOG = structlog.get_logger(__name__)
@ -60,3 +61,40 @@ async def run_workflow(
api_key=api_key, api_key=api_key,
) )
return workflow_run return workflow_run
async def get_workflow_run_response(
workflow_run_id: str, organization_id: str | None = None
) -> WorkflowRunResponse | None:
workflow_run = await app.DATABASE.get_workflow_run(workflow_run_id, organization_id=organization_id)
if not workflow_run:
return None
workflow_run_resp = await app.WORKFLOW_SERVICE.build_workflow_run_status_response_by_workflow_id(
workflow_run_id=workflow_run.workflow_run_id,
organization_id=organization_id,
)
app_url = (
f"{settings.SKYVERN_APP_URL.rstrip('/')}/{workflow_run.workflow_permanent_id}/{workflow_run.workflow_run_id}"
)
return WorkflowRunResponse(
run_id=workflow_run_id,
run_type=RunType.workflow_run,
status=RunStatus(workflow_run.status),
output=workflow_run_resp.outputs,
downloaded_files=workflow_run_resp.downloaded_files,
recording_url=workflow_run_resp.recording_url,
failure_reason=workflow_run_resp.failure_reason,
app_url=app_url,
created_at=workflow_run.created_at,
modified_at=workflow_run.modified_at,
run_request=WorkflowRunRequest(
workflow_id=workflow_run.workflow_id,
title=workflow_run.title,
parameters=workflow_run_resp.parameters,
proxy_location=workflow_run.proxy_location,
webhook_url=workflow_run.webhook_callback_url,
totp_url=workflow_run.totp_verification_url,
totp_identifier=workflow_run.totp_identifier,
# TODO: add browser session id
),
)