add "when" and "choose" as a draft step
This commit is contained in:
@@ -6,18 +6,24 @@ from .api import (
|
||||
validate_workflow_draft,
|
||||
)
|
||||
from .models import (
|
||||
DraftChooseClause,
|
||||
DraftChooseStep,
|
||||
DraftForeachStep,
|
||||
DraftInterruptStep,
|
||||
DraftJoinStep,
|
||||
DraftWhenStep,
|
||||
DraftUseStep,
|
||||
WorkflowDraft,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"DraftDiagnostic",
|
||||
"DraftChooseClause",
|
||||
"DraftChooseStep",
|
||||
"DraftForeachStep",
|
||||
"DraftInterruptStep",
|
||||
"DraftJoinStep",
|
||||
"DraftWhenStep",
|
||||
"DraftUseStep",
|
||||
"WorkflowDraft",
|
||||
"build_workflow_from_draft",
|
||||
|
||||
@@ -9,6 +9,8 @@ from .models import (
|
||||
DraftJoinStep,
|
||||
DraftStep,
|
||||
DraftUseStep,
|
||||
DraftWhenStep,
|
||||
DraftChooseStep,
|
||||
WorkflowDraft,
|
||||
)
|
||||
|
||||
@@ -61,4 +63,20 @@ def _add_step(builder: WorkflowBuilder, step_id: str, step: DraftStep):
|
||||
node = JoinNode(id=step_id, type="join")
|
||||
builder.nodes.append(node)
|
||||
return node
|
||||
if isinstance(step, DraftWhenStep):
|
||||
return builder.when(
|
||||
step.when.if_,
|
||||
id=step_id,
|
||||
then=step.when.then,
|
||||
otherwise=step.when.otherwise,
|
||||
).entry
|
||||
if isinstance(step, DraftChooseStep):
|
||||
return builder.choose(
|
||||
*[
|
||||
(clause.if_, clause.then)
|
||||
for clause in step.choose.clauses
|
||||
],
|
||||
id=step_id,
|
||||
default=step.choose.default,
|
||||
).entry
|
||||
raise TypeError(f"unsupported draft step {type(step)!r}")
|
||||
|
||||
@@ -4,8 +4,10 @@ from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel, Field, model_validator
|
||||
|
||||
from wf_core.models.conditions import Condition
|
||||
|
||||
JsonObject = dict[str, Any]
|
||||
STEP_KIND_KEYS = frozenset({"use", "foreach", "interrupt", "join"})
|
||||
STEP_KIND_KEYS = frozenset({"use", "foreach", "interrupt", "join", "when", "choose"})
|
||||
|
||||
|
||||
class DraftUseStep(BaseModel):
|
||||
@@ -55,7 +57,48 @@ class DraftJoinStep(BaseModel):
|
||||
join: JsonObject = Field(default_factory=dict)
|
||||
|
||||
|
||||
DraftStep = DraftUseStep | DraftForeachStep | DraftInterruptStep | DraftJoinStep
|
||||
class DraftWhenPayload(BaseModel):
|
||||
"""Payload for one boolean draft decision."""
|
||||
|
||||
if_: Condition = Field(alias="if")
|
||||
then: str
|
||||
otherwise: str = "__end__"
|
||||
|
||||
|
||||
class DraftWhenStep(BaseModel):
|
||||
"""Draft step that delegates one boolean decision to `WorkflowBuilder.when`."""
|
||||
|
||||
when: DraftWhenPayload
|
||||
|
||||
|
||||
class DraftChooseClause(BaseModel):
|
||||
"""One ordered boolean clause in a draft choose decision."""
|
||||
|
||||
if_: Condition = Field(alias="if")
|
||||
then: str
|
||||
|
||||
|
||||
class DraftChoosePayload(BaseModel):
|
||||
"""Payload for an ordered first-true draft decision."""
|
||||
|
||||
clauses: list[DraftChooseClause] = Field(min_length=1)
|
||||
default: str = "__end__"
|
||||
|
||||
|
||||
class DraftChooseStep(BaseModel):
|
||||
"""Draft step that delegates ordered decisions to `WorkflowBuilder.choose`."""
|
||||
|
||||
choose: DraftChoosePayload
|
||||
|
||||
|
||||
DraftStep = (
|
||||
DraftUseStep
|
||||
| DraftForeachStep
|
||||
| DraftInterruptStep
|
||||
| DraftJoinStep
|
||||
| DraftWhenStep
|
||||
| DraftChooseStep
|
||||
)
|
||||
|
||||
|
||||
class WorkflowDraft(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user