DeerFlowClient 增加state schema参数 #3968
Replies: 1 comment 1 reply
|
你这个需求其实现在已经能满足,不需要改 原因是 LangChain 的 源码依据( state_schemas: set[type] = {m.state_schema for m in middleware} # 收集每个 middleware 的 schema
base_state = state_schema if state_schema is not None else AgentState
state_schemas.add(base_state)
resolved_state_schema, input_schema, output_schema = _resolve_schemas(state_schemas) # 按 field 合并所以推荐做法是:在自定义 middleware 上设置 from typing import NotRequired, TypedDict
from langchain.agents.middleware import AgentMiddleware
from deerflow.agents.thread_state import ThreadState
# 继承原来的 state 类型,扩展自定义字段
class MyState(ThreadState):
my_custom_field: NotRequired[str | None]
class MyMiddleware(AgentMiddleware[MyState]):
state_schema = MyState # ← 关键:这个字段会被合并进 graph state
def before_model(self, state, runtime):
# 既可读自定义字段,也能读到 ThreadState 的字段(因为继承了)
val = state.get("my_custom_field")
return {"my_custom_field": "..."} # 写回的是真实 channel,会被 checkpoint 持久化然后照常传给 client: client = DeerFlowClient(middlewares=[MyMiddleware()])这里要分清两个层面:
两个层面是独立的,所以即使 middleware 不带泛型,运行时也照样能跑;带上泛型只是让 IDE / mypy 更舒服。 几点注意事项:
补充一点:如果你想要的自定义字段不属于任何 middleware(比如只想在某个 tool 或自定义 node 里读写),那目前确实没有入口—— 如果你有这种场景,可以考虑给 |
Uh oh!
There was an error while loading. Please reload this page.
自定义的middleware中会依赖一些自定义的state字段,希望可以加个state schema参数限制继承原本的state类型,不然的话自定义的middleware太受限了
All reactions