feat: expose generic draft steps over rpc
This commit is contained in:
@@ -3,6 +3,9 @@ from __future__ import annotations
|
||||
from collections.abc import Sequence
|
||||
from typing import Any, Literal
|
||||
|
||||
from wf_api.surface import RouteSource
|
||||
from wf_artifacts.drafts.models import DraftStep
|
||||
|
||||
from .base import RpcCaller
|
||||
|
||||
|
||||
@@ -207,6 +210,32 @@ class RpcDraftClientMixin:
|
||||
},
|
||||
)
|
||||
|
||||
async def add_step(
|
||||
self: RpcCaller,
|
||||
*,
|
||||
workspace_id: str,
|
||||
revision: int,
|
||||
step_id: str,
|
||||
step: DraftStep,
|
||||
incoming: RouteSource | None = None,
|
||||
routes: dict[str, str] | None = None,
|
||||
) -> dict[str, Any]:
|
||||
return await self._call(
|
||||
"workflow.draft_workspaces.add_step",
|
||||
{
|
||||
"workspace_id": workspace_id,
|
||||
"revision": revision,
|
||||
"step_id": step_id,
|
||||
"step": step.model_dump(mode="json", by_alias=True),
|
||||
"incoming": (
|
||||
None
|
||||
if incoming is None
|
||||
else {"step_id": incoming.step_id, "outcome": incoming.outcome}
|
||||
),
|
||||
"routes": routes,
|
||||
},
|
||||
)
|
||||
|
||||
async def branch_draft(
|
||||
self: RpcCaller,
|
||||
*,
|
||||
|
||||
@@ -4,10 +4,12 @@ from typing import Any
|
||||
|
||||
import fastapi_jsonrpc as jsonrpc
|
||||
|
||||
from wf_api.surface import RouteSource
|
||||
from wf_server import WorkflowServer
|
||||
|
||||
from ..errors import WorkflowRpcError, raise_workflow_rpc_error
|
||||
from ..models import (
|
||||
AddDraftStepParams,
|
||||
AddStepFromCapabilityParams,
|
||||
BindDraftParams,
|
||||
BranchDraftParams,
|
||||
@@ -243,6 +245,33 @@ def register_methods(
|
||||
except (ValueError, KeyError, LookupError, FileNotFoundError) as exc:
|
||||
raise_workflow_rpc_error(exc)
|
||||
|
||||
@entrypoint.method(
|
||||
name="workflow.draft_workspaces.add_step",
|
||||
errors=[WorkflowRpcError],
|
||||
)
|
||||
async def workflow_draft_workspaces_add_step(
|
||||
params: AddDraftStepParams = RpcParams(),
|
||||
) -> dict[str, Any]:
|
||||
try:
|
||||
incoming = (
|
||||
None
|
||||
if params.incoming is None
|
||||
else RouteSource(
|
||||
step_id=params.incoming.step_id,
|
||||
outcome=params.incoming.outcome,
|
||||
)
|
||||
)
|
||||
return await server.api.add_step(
|
||||
workspace_id=params.workspace_id,
|
||||
revision=params.revision,
|
||||
step_id=params.step_id,
|
||||
step=params.step,
|
||||
incoming=incoming,
|
||||
routes=params.routes,
|
||||
)
|
||||
except (ValueError, KeyError, LookupError, FileNotFoundError) as exc:
|
||||
raise_workflow_rpc_error(exc)
|
||||
|
||||
@entrypoint.method(
|
||||
name="workflow.draft_workspaces.branch", errors=[WorkflowRpcError]
|
||||
)
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any, Literal
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
from wf_api.models import TraceRange
|
||||
from wf_artifacts.drafts.models import DraftStep
|
||||
|
||||
|
||||
class RpcParamsModel(BaseModel):
|
||||
@@ -100,6 +101,20 @@ class ListDraftWorkspacesParams(RpcParamsModel):
|
||||
pass
|
||||
|
||||
|
||||
class RouteSourceParams(RpcParamsModel):
|
||||
step_id: str = Field(min_length=1)
|
||||
outcome: str = Field(default="ok", min_length=1)
|
||||
|
||||
|
||||
class AddDraftStepParams(RpcParamsModel):
|
||||
workspace_id: str = Field(min_length=1)
|
||||
revision: int = Field(ge=1)
|
||||
step_id: str = Field(min_length=1)
|
||||
step: DraftStep
|
||||
incoming: RouteSourceParams | None = None
|
||||
routes: dict[str, str] | None = None
|
||||
|
||||
|
||||
class GetDraftWorkspaceParams(RpcParamsModel):
|
||||
workspace_id: str = Field(min_length=1)
|
||||
include_draft: bool = False
|
||||
|
||||
Reference in New Issue
Block a user