|
@@ -73,11 +73,24 @@ def compute(arg: typing.Callable[[Context], typing.Any], /) -> typing.Any:
|
|
|
return pydantic.Field(default=Factory(arg))
|
|
return pydantic.Field(default=Factory(arg))
|
|
|
|
|
|
|
|
|
|
|
|
|
-def outputs(**fields: types.UnionType | type[typing.Any]) -> Outputs:
|
|
|
|
|
|
|
+T = typing.TypeVar("T")
|
|
|
|
|
+type TypeInfo[T] = types.UnionType | type[T]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def outputs(
|
|
|
|
|
+ **fields: TypeInfo[typing.Any] | tuple[TypeInfo[typing.Any], Ref],
|
|
|
|
|
+) -> Outputs:
|
|
|
|
|
+
|
|
|
|
|
+ def to_annotation(field):
|
|
|
|
|
+ if isinstance(field, tuple):
|
|
|
|
|
+ return typing.Annotated[field[0], pydantic.Field(default=field[1])]
|
|
|
|
|
+ else:
|
|
|
|
|
+ return typing.Annotated[field, pydantic.Field(default=None)]
|
|
|
|
|
+
|
|
|
frame = sys._getframe(1)
|
|
frame = sys._getframe(1)
|
|
|
return pydantic.create_model( # type: ignore[call-overload]
|
|
return pydantic.create_model( # type: ignore[call-overload]
|
|
|
f"__{frame.f_lineno}_AnonymousOutputs",
|
|
f"__{frame.f_lineno}_AnonymousOutputs",
|
|
|
__base__=Outputs,
|
|
__base__=Outputs,
|
|
|
__module__=frame.f_globals["__name__"],
|
|
__module__=frame.f_globals["__name__"],
|
|
|
- **{k: typing.Annotated[t, pydantic.Field(default=None)] for k, t in fields.items()}
|
|
|
|
|
|
|
+ **{k: to_annotation(t) for k, t in fields.items()},
|
|
|
)()
|
|
)()
|