more std, and buffing @node

This commit is contained in:
lda
2026-05-06 23:17:45 +07:00 Verified
parent 1f8a22d2a9
commit 8d3b88c6e7
7 changed files with 288 additions and 7 deletions
+47 -5
View File
@@ -13,17 +13,39 @@ from .spec import NodeSpec
@overload
def node(
fn: NodeCallable[InputT, OutputT] | AsyncNodeCallable[InputT, OutputT],
fn: NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT],
/,
) -> NodeSpec[InputT, OutputT]: ...
@overload
def node(
fn: NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT],
/,
*,
name: str | None = None,
input_model: type[InputT] | None = None,
output_model: type[OutputT] | None = None,
outcomes: tuple[str, ...] = ("ok",),
description: str | None = None,
is_async: bool | None = None,
) -> NodeSpec[InputT, OutputT]: ...
@overload
def node(
fn: None = None,
/,
) -> Callable[
[NodeCallable[InputT, OutputT] | AsyncNodeCallable[InputT, OutputT]],
[
NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT]
],
NodeSpec[InputT, OutputT],
]: ...
@@ -40,13 +62,18 @@ def node(
description: str | None = None,
is_async: bool | None = None,
) -> Callable[
[NodeCallable[InputT, OutputT] | AsyncNodeCallable[InputT, OutputT]],
[
NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT]
],
NodeSpec[InputT, OutputT],
]: ...
def node(
fn: NodeCallable[InputT, OutputT]
fn: NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT]
| None = None,
*,
@@ -58,9 +85,24 @@ def node(
is_async: bool | None = None,
) -> Any:
"""Convert a typed Python function into a reusable workflow node spec."""
def decorator(
fn: NodeCallable[InputT, OutputT] | AsyncNodeCallable[InputT, OutputT],
fn: NodeSpec[InputT, OutputT]
| NodeCallable[InputT, OutputT]
| AsyncNodeCallable[InputT, OutputT],
) -> NodeSpec[InputT, OutputT]:
if isinstance(fn, NodeSpec):
return NodeSpec(
name=name or fn.name,
input_model=input_model or fn.input_model,
output_model=output_model or fn.output_model,
outcomes=outcomes if outcomes != ("ok",) else fn.outcomes,
fn=fn.fn,
description=description or fn.description,
is_async=is_async if is_async is not None else fn.is_async,
accepts_context=fn.accepts_context,
)
inferred_input_model: type[BaseModel] | None = input_model
inferred_output_model: type[BaseModel] | None = output_model
if inferred_input_model is None or inferred_output_model is None: