关于结点函数参数类型,先看LangGraph-0x06-input_schema为什么存在
1 指定了入参类型
除了input_schema,还有一种指定方式,通过input参数
1 2 3 4 5 6 7 8 9 10
| if (input_ := kwargs.get("input", MISSING)) is not MISSING: warnings.warn( "`input` is deprecated and will be removed. Please use `input_schema` instead.", category=LangGraphDeprecatedSinceV05, ) if input_schema is None: input_schema = cast(type[NodeInputT] | None, input_) timeout = coerce_timeout_policy(timeout)
|
2 没有指定
没有指定类型就要自己去推断了,怎么推断呢,拿到函数的参数列表,这个时候无非有3种情况
每个人的开发习惯不一样,有人习惯def fn(a:A)->B:,有个习惯def fn(a):,有类型注解的就好办,入参的类型就是注解的类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| hints := get_type_hints(getattr(action, "__call__")) or get_type_hints(action)
...
if input_hint := hints.get(first_parameter_name): if isinstance(input_hint, type) and get_type_hints(input_hint): inferred_input_schema = input_hint
|
上面的源码解决了什么问题,有类型注解的,有一个或者多个形参的,都用第一个形参的类型注解当作推断出来的形参类型。
1 2 3 4 5 6 7
|
resolved_input_schema: type[Any] = ( input_schema or inferred_input_schema or self.state_schema )
|
没有给参数注解类型的,用State类型当作函数入参类型。空参数的,也用State类型当作函数入参类型。
1 2 3 4 5 6 7 8 9 10 11 12 13
| @dataclass(slots=True) class StateNodeSpec(Generic[NodeInputT, ContextT]): runnable: StateNode[NodeInputT, ContextT] metadata: dict[str, Any] | None input_schema: type[NodeInputT] retry_policy: RetryPolicy | Sequence[RetryPolicy] | None cache_policy: CachePolicy | None is_error_handler: bool = False error_handler_node: str | None = None ends: tuple[str, ...] | dict[str, str] | None = EMPTY_SEQ defer: bool = False timeout: TimeoutPolicy | None = None
|