LangGraph作为框架,抽象了node这个概念,目的就是为了完成某个功能,本质就是函数
那么这个函数可能有哪些形态呢
- 普通的全局函数
- 类的成员函数
- 类的实例 这个类实现了__call__函数
如此种种,将来框架想要调度的时候就要分门别类进行判断啥类型的,与其每次调度的时候判断,不如结点往框架注册的时候就一次性判断好,然后封装成统一的结构。
这个统一的封装就是Runnable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| def coerce_to_runnable( thing: RunnableLike, *, name: str | None, trace: bool ) -> Runnable: if isinstance(thing, Runnable): return thing elif is_async_generator(thing) or inspect.isgeneratorfunction(thing): return RunnableLambda(thing, name=name) elif callable(thing): if is_async_callable(thing): return RunnableCallable(None, thing, name=name, trace=trace) else: return RunnableCallable( thing, wraps(thing)(partial(run_in_executor, None, thing)), name=name, trace=trace, ) elif isinstance(thing, dict): return RunnableParallel(thing) else: ...
|