WorkflowRunStatusResponse -> WorkflowRunResponse (#1959)

This commit is contained in:
Shuchang Zheng 2025-03-17 15:19:18 -07:00 committed by GitHub
parent 8955c0498c
commit 09fb6ae60a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 44 additions and 43 deletions

View file

@ -14,7 +14,7 @@ from skyvern.forge.prompts import prompt_engine
from skyvern.forge.sdk.api.files import create_folder_if_not_exist from skyvern.forge.sdk.api.files import create_folder_if_not_exist
from skyvern.forge.sdk.schemas.task_v2 import TaskV2, TaskV2Request from skyvern.forge.sdk.schemas.task_v2 import TaskV2, TaskV2Request
from skyvern.forge.sdk.schemas.tasks import ProxyLocation, TaskRequest, TaskResponse, TaskStatus from skyvern.forge.sdk.schemas.tasks import ProxyLocation, TaskRequest, TaskResponse, TaskStatus
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRequestBody, WorkflowRunStatus, WorkflowRunStatusResponse from skyvern.forge.sdk.workflow.models.workflow import WorkflowRequestBody, WorkflowRunResponse, WorkflowRunStatus
class TaskOutput(BaseModel): class TaskOutput(BaseModel):
@ -70,7 +70,7 @@ class SkyvernClient:
assert response.status_code == 200, f"Expected to get task response status 200, but got {response.status_code}" assert response.status_code == 200, f"Expected to get task response status 200, but got {response.status_code}"
return TaskResponse(**response.json()) return TaskResponse(**response.json())
async def get_workflow_run(self, workflow_pid: str, workflow_run_id: str) -> WorkflowRunStatusResponse: async def get_workflow_run(self, workflow_pid: str, workflow_run_id: str) -> WorkflowRunResponse:
url = f"{self.base_url}/workflows/{workflow_pid}/runs/{workflow_run_id}" url = f"{self.base_url}/workflows/{workflow_pid}/runs/{workflow_run_id}"
headers = {"x-api-key": self.credentials} headers = {"x-api-key": self.credentials}
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
@ -78,7 +78,7 @@ class SkyvernClient:
assert response.status_code == 200, ( assert response.status_code == 200, (
f"Expected to get workflow run response status 200, but got {response.status_code}" f"Expected to get workflow run response status 200, but got {response.status_code}"
) )
return WorkflowRunStatusResponse(**response.json()) return WorkflowRunResponse(**response.json())
class Evaluator: class Evaluator:

View file

@ -1164,7 +1164,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/WorkflowRunStatusResponse' $ref: '#/components/schemas/WorkflowRunResponse'
'422': '422':
description: Validation Error description: Validation Error
content: content:
@ -4879,7 +4879,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/WorkflowRunStatusResponse' $ref: '#/components/schemas/WorkflowRunResponse'
'422': '422':
description: Validation Error description: Validation Error
content: content:
@ -9373,7 +9373,7 @@ components:
- timed_out - timed_out
- completed - completed
title: WorkflowRunStatus title: WorkflowRunStatus
WorkflowRunStatusResponse: WorkflowRunResponse:
properties: properties:
workflow_id: workflow_id:
type: string type: string
@ -9464,7 +9464,7 @@ components:
- created_at - created_at
- modified_at - modified_at
- parameters - parameters
title: WorkflowRunStatusResponse title: WorkflowRunResponse
WorkflowRunTimeline: WorkflowRunTimeline:
properties: properties:
type: type:

View file

@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "skyvern" name = "skyvern"
version = "0.1.63" version = "0.1.64.dev0"
description = "" description = ""
authors = ["Skyvern AI <info@skyvern.com>"] authors = ["Skyvern AI <info@skyvern.com>"]
readme = "README.md" readme = "README.md"

View file

@ -3,6 +3,7 @@ from ddtrace.filters import FilterRequestsOnUrl
from skyvern.agent import SkyvernAgent, SkyvernClient from skyvern.agent import SkyvernAgent, SkyvernClient
from skyvern.forge.sdk.forge_log import setup_logger from skyvern.forge.sdk.forge_log import setup_logger
from skyvern.forge.sdk.workflow.models.workflow import WorkflowRunResponse
tracer.configure( tracer.configure(
settings={ settings={
@ -13,4 +14,4 @@ tracer.configure(
) )
setup_logger() setup_logger()
__all__ = ["SkyvernAgent", "SkyvernClient"] __all__ = ["SkyvernAgent", "SkyvernClient", "WorkflowRunResponse"]

View file

@ -7,7 +7,7 @@ from skyvern.config import settings
from skyvern.exceptions import SkyvernClientException from skyvern.exceptions import SkyvernClientException
from skyvern.forge.sdk.schemas.task_runs import TaskRunResponse from skyvern.forge.sdk.schemas.task_runs import TaskRunResponse
from skyvern.forge.sdk.schemas.tasks import ProxyLocation from skyvern.forge.sdk.schemas.tasks import ProxyLocation
from skyvern.forge.sdk.workflow.models.workflow import RunWorkflowResponse, WorkflowRunStatusResponse from skyvern.forge.sdk.workflow.models.workflow import RunWorkflowResponse, WorkflowRunResponse
class RunEngine(StrEnum): class RunEngine(StrEnum):
@ -82,7 +82,7 @@ class SkyvernClient:
async def get_workflow_run( async def get_workflow_run(
self, self,
workflow_run_id: str, workflow_run_id: str,
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
response = await client.get( response = await client.get(
f"{self.base_url}/api/v1/workflows/runs/{workflow_run_id}", f"{self.base_url}/api/v1/workflows/runs/{workflow_run_id}",
@ -94,4 +94,4 @@ class SkyvernClient:
f"Failed to get workflow run: {response.text}", f"Failed to get workflow run: {response.text}",
status_code=response.status_code, status_code=response.status_code,
) )
return WorkflowRunStatusResponse.model_validate(response.json()) return WorkflowRunResponse.model_validate(response.json())

View file

@ -246,7 +246,7 @@ from .types import (
WorkflowRunBlockNavigationPayload, WorkflowRunBlockNavigationPayload,
WorkflowRunBlockOutput, WorkflowRunBlockOutput,
WorkflowRunStatus, WorkflowRunStatus,
WorkflowRunStatusResponse, WorkflowRunResponse,
WorkflowRunTimeline, WorkflowRunTimeline,
WorkflowRunTimelineType, WorkflowRunTimelineType,
WorkflowStatus, WorkflowStatus,
@ -510,7 +510,7 @@ __all__ = [
"WorkflowRunBlockNavigationPayload", "WorkflowRunBlockNavigationPayload",
"WorkflowRunBlockOutput", "WorkflowRunBlockOutput",
"WorkflowRunStatus", "WorkflowRunStatus",
"WorkflowRunStatusResponse", "WorkflowRunResponse",
"WorkflowRunTimeline", "WorkflowRunTimeline",
"WorkflowRunTimelineType", "WorkflowRunTimelineType",
"WorkflowStatus", "WorkflowStatus",

View file

@ -30,7 +30,7 @@ from ..types.run_workflow_response import RunWorkflowResponse
from ..types.workflow_run_status import WorkflowRunStatus from ..types.workflow_run_status import WorkflowRunStatus
from ..types.workflow_run import WorkflowRun from ..types.workflow_run import WorkflowRun
from ..types.workflow_run_timeline import WorkflowRunTimeline from ..types.workflow_run_timeline import WorkflowRunTimeline
from ..types.workflow_run_status_response import WorkflowRunStatusResponse from ..types.workflow_run_status_response import WorkflowRunResponse
from ..types.workflow import Workflow from ..types.workflow import Workflow
from ..types.ai_suggestion_base import AiSuggestionBase from ..types.ai_suggestion_base import AiSuggestionBase
from ..types.task_generation import TaskGeneration from ..types.task_generation import TaskGeneration
@ -1658,7 +1658,7 @@ class AgentClient:
api_key: typing.Optional[str] = None, api_key: typing.Optional[str] = None,
authorization: typing.Optional[str] = None, authorization: typing.Optional[str] = None,
request_options: typing.Optional[RequestOptions] = None, request_options: typing.Optional[RequestOptions] = None,
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
""" """
Parameters Parameters
---------- ----------
@ -1673,7 +1673,7 @@ class AgentClient:
Returns Returns
------- -------
WorkflowRunStatusResponse WorkflowRunResponse
Successful Response Successful Response
Examples Examples
@ -1697,9 +1697,9 @@ class AgentClient:
try: try:
if 200 <= _response.status_code < 300: if 200 <= _response.status_code < 300:
return typing.cast( return typing.cast(
WorkflowRunStatusResponse, WorkflowRunResponse,
parse_obj_as( parse_obj_as(
type_=WorkflowRunStatusResponse, # type: ignore type_=WorkflowRunResponse, # type: ignore
object_=_response.json(), object_=_response.json(),
), ),
) )
@ -3457,7 +3457,7 @@ class AgentClient:
def get_eval_workflow_run_by_run_id( def get_eval_workflow_run_by_run_id(
self, workflow_run_id: str, *, request_options: typing.Optional[RequestOptions] = None self, workflow_run_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
""" """
Parameters Parameters
---------- ----------
@ -3468,7 +3468,7 @@ class AgentClient:
Returns Returns
------- -------
WorkflowRunStatusResponse WorkflowRunResponse
Successful Response Successful Response
Examples Examples
@ -3488,9 +3488,9 @@ class AgentClient:
try: try:
if 200 <= _response.status_code < 300: if 200 <= _response.status_code < 300:
return typing.cast( return typing.cast(
WorkflowRunStatusResponse, WorkflowRunResponse,
parse_obj_as( parse_obj_as(
type_=WorkflowRunStatusResponse, # type: ignore type_=WorkflowRunResponse, # type: ignore
object_=_response.json(), object_=_response.json(),
), ),
) )
@ -5741,7 +5741,7 @@ class AsyncAgentClient:
api_key: typing.Optional[str] = None, api_key: typing.Optional[str] = None,
authorization: typing.Optional[str] = None, authorization: typing.Optional[str] = None,
request_options: typing.Optional[RequestOptions] = None, request_options: typing.Optional[RequestOptions] = None,
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
""" """
Parameters Parameters
---------- ----------
@ -5756,7 +5756,7 @@ class AsyncAgentClient:
Returns Returns
------- -------
WorkflowRunStatusResponse WorkflowRunResponse
Successful Response Successful Response
Examples Examples
@ -5788,9 +5788,9 @@ class AsyncAgentClient:
try: try:
if 200 <= _response.status_code < 300: if 200 <= _response.status_code < 300:
return typing.cast( return typing.cast(
WorkflowRunStatusResponse, WorkflowRunResponse,
parse_obj_as( parse_obj_as(
type_=WorkflowRunStatusResponse, # type: ignore type_=WorkflowRunResponse, # type: ignore
object_=_response.json(), object_=_response.json(),
), ),
) )
@ -7739,7 +7739,7 @@ class AsyncAgentClient:
async def get_eval_workflow_run_by_run_id( async def get_eval_workflow_run_by_run_id(
self, workflow_run_id: str, *, request_options: typing.Optional[RequestOptions] = None self, workflow_run_id: str, *, request_options: typing.Optional[RequestOptions] = None
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
""" """
Parameters Parameters
---------- ----------
@ -7750,7 +7750,7 @@ class AsyncAgentClient:
Returns Returns
------- -------
WorkflowRunStatusResponse WorkflowRunResponse
Successful Response Successful Response
Examples Examples
@ -7778,9 +7778,9 @@ class AsyncAgentClient:
try: try:
if 200 <= _response.status_code < 300: if 200 <= _response.status_code < 300:
return typing.cast( return typing.cast(
WorkflowRunStatusResponse, WorkflowRunResponse,
parse_obj_as( parse_obj_as(
type_=WorkflowRunStatusResponse, # type: ignore type_=WorkflowRunResponse, # type: ignore
object_=_response.json(), object_=_response.json(),
), ),
) )

View file

@ -277,7 +277,7 @@ from .workflow_run_block_data_schema import WorkflowRunBlockDataSchema
from .workflow_run_block_navigation_payload import WorkflowRunBlockNavigationPayload from .workflow_run_block_navigation_payload import WorkflowRunBlockNavigationPayload
from .workflow_run_block_output import WorkflowRunBlockOutput from .workflow_run_block_output import WorkflowRunBlockOutput
from .workflow_run_status import WorkflowRunStatus from .workflow_run_status import WorkflowRunStatus
from .workflow_run_status_response import WorkflowRunStatusResponse from .workflow_run_status_response import WorkflowRunResponse
from .workflow_run_timeline import WorkflowRunTimeline from .workflow_run_timeline import WorkflowRunTimeline
from .workflow_run_timeline_type import WorkflowRunTimelineType from .workflow_run_timeline_type import WorkflowRunTimelineType
from .workflow_status import WorkflowStatus from .workflow_status import WorkflowStatus
@ -528,7 +528,7 @@ __all__ = [
"WorkflowRunBlockNavigationPayload", "WorkflowRunBlockNavigationPayload",
"WorkflowRunBlockOutput", "WorkflowRunBlockOutput",
"WorkflowRunStatus", "WorkflowRunStatus",
"WorkflowRunStatusResponse", "WorkflowRunResponse",
"WorkflowRunTimeline", "WorkflowRunTimeline",
"WorkflowRunTimelineType", "WorkflowRunTimelineType",
"WorkflowStatus", "WorkflowStatus",

View file

@ -10,7 +10,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2
import pydantic import pydantic
class WorkflowRunStatusResponse(UniversalBaseModel): class WorkflowRunResponse(UniversalBaseModel):
workflow_id: str workflow_id: str
workflow_run_id: str workflow_run_id: str
status: WorkflowRunStatus status: WorkflowRunStatus

View file

@ -70,8 +70,8 @@ from skyvern.forge.sdk.workflow.models.workflow import (
Workflow, Workflow,
WorkflowRequestBody, WorkflowRequestBody,
WorkflowRun, WorkflowRun,
WorkflowRunResponse,
WorkflowRunStatus, WorkflowRunStatus,
WorkflowRunStatusResponse,
WorkflowStatus, WorkflowStatus,
) )
from skyvern.forge.sdk.workflow.models.yaml import WorkflowCreateYAMLRequest from skyvern.forge.sdk.workflow.models.yaml import WorkflowCreateYAMLRequest
@ -714,17 +714,17 @@ async def get_workflow_run_timeline(
@base_router.get( @base_router.get(
"/workflows/runs/{workflow_run_id}", "/workflows/runs/{workflow_run_id}",
response_model=WorkflowRunStatusResponse, response_model=WorkflowRunResponse,
) )
@base_router.get( @base_router.get(
"/workflows/runs/{workflow_run_id}/", "/workflows/runs/{workflow_run_id}/",
response_model=WorkflowRunStatusResponse, response_model=WorkflowRunResponse,
include_in_schema=False, include_in_schema=False,
) )
async def get_workflow_run( async def get_workflow_run(
workflow_run_id: str, workflow_run_id: str,
current_org: Organization = Depends(org_auth_service.get_current_org), current_org: Organization = Depends(org_auth_service.get_current_org),
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
analytics.capture("skyvern-oss-agent-workflow-run-get") analytics.capture("skyvern-oss-agent-workflow-run-get")
return await app.WORKFLOW_SERVICE.build_workflow_run_status_response_by_workflow_id( return await app.WORKFLOW_SERVICE.build_workflow_run_status_response_by_workflow_id(
workflow_run_id=workflow_run_id, workflow_run_id=workflow_run_id,

View file

@ -130,7 +130,7 @@ class WorkflowRunOutputParameter(BaseModel):
created_at: datetime created_at: datetime
class WorkflowRunStatusResponse(BaseModel): class WorkflowRunResponse(BaseModel):
workflow_id: str workflow_id: str
workflow_run_id: str workflow_run_id: str
status: WorkflowRunStatus status: WorkflowRunStatus

View file

@ -79,8 +79,8 @@ from skyvern.forge.sdk.workflow.models.workflow import (
WorkflowRun, WorkflowRun,
WorkflowRunOutputParameter, WorkflowRunOutputParameter,
WorkflowRunParameter, WorkflowRunParameter,
WorkflowRunResponse,
WorkflowRunStatus, WorkflowRunStatus,
WorkflowRunStatusResponse,
WorkflowStatus, WorkflowStatus,
) )
from skyvern.forge.sdk.workflow.models.yaml import ( from skyvern.forge.sdk.workflow.models.yaml import (
@ -949,7 +949,7 @@ class WorkflowService:
workflow_run_id: str, workflow_run_id: str,
organization_id: str, organization_id: str,
include_cost: bool = False, include_cost: bool = False,
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
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)
if workflow_run is None: if workflow_run is None:
LOG.error(f"Workflow run {workflow_run_id} not found") LOG.error(f"Workflow run {workflow_run_id} not found")
@ -968,7 +968,7 @@ class WorkflowService:
workflow_run_id: str, workflow_run_id: str,
organization_id: str, organization_id: str,
include_cost: bool = False, include_cost: bool = False,
) -> WorkflowRunStatusResponse: ) -> WorkflowRunResponse:
workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id) workflow = await self.get_workflow_by_permanent_id(workflow_permanent_id)
if workflow is None: if workflow is None:
LOG.error(f"Workflow {workflow_permanent_id} not found") LOG.error(f"Workflow {workflow_permanent_id} not found")
@ -1064,7 +1064,7 @@ class WorkflowService:
# successful steps are the ones that have a status of completed and the total count of unique step.order # successful steps are the ones that have a status of completed and the total count of unique step.order
successful_steps = [step for step in workflow_run_steps if step.status == StepStatus.completed] successful_steps = [step for step in workflow_run_steps if step.status == StepStatus.completed]
total_cost = 0.1 * (len(successful_steps) + len(text_prompt_blocks)) total_cost = 0.1 * (len(successful_steps) + len(text_prompt_blocks))
return WorkflowRunStatusResponse( return WorkflowRunResponse(
workflow_id=workflow.workflow_permanent_id, workflow_id=workflow.workflow_permanent_id,
workflow_run_id=workflow_run_id, workflow_run_id=workflow_run_id,
status=workflow_run.status, status=workflow_run.status,