concurrent foreach preparation, types, validation, refactors

This commit is contained in:
lda
2026-05-22 12:11:51 +07:00 Verified
parent afafe40109
commit d8d5770c9f
17 changed files with 712 additions and 15 deletions
+1
View File
@@ -53,6 +53,7 @@ def _add_step(builder: WorkflowBuilder, step_id: str, step: DraftStep):
as_=step.foreach.as_,
mode=step.foreach.mode,
on_item_error=step.foreach.on_item_error,
concurrent=step.foreach.concurrent,
)
if isinstance(step, DraftInterruptStep):
return builder.interrupt(
+17 -1
View File
@@ -97,8 +97,24 @@ class DraftForeachPayload(BaseModel):
over: GraphSourcePath
as_: str = Field(alias="as")
mode: Literal["serial", "parallel"] = "serial"
mode: Literal["serial", "concurrent"] = "serial"
on_item_error: Literal["fail", "collect", "skip"] = "fail"
concurrent: JsonObject | None = None
@model_validator(mode="before")
@classmethod
def _coerce_legacy_parallel_policy(cls, data: object) -> object:
"""Accept old draft foreach parallel names as parse-only compatibility."""
if not isinstance(data, dict):
return data
normalized = dict(data)
if normalized.get("mode") == "parallel":
normalized["mode"] = "concurrent"
if "parallel" in normalized:
if "concurrent" in normalized:
raise ValueError("cannot mix deprecated parallel with concurrent")
normalized["concurrent"] = normalized.pop("parallel")
return normalized
class DraftForeachStep(BaseModel):