add "when" and "choose" as a draft step

This commit is contained in:
lda
2026-05-19 06:35:47 +07:00 Verified
parent 760207038f
commit 66db83dc5a
7 changed files with 291 additions and 7 deletions
+6
View File
@@ -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",
+18
View File
@@ -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}")
+45 -2
View File
@@ -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):