LingxiGraph
开发指南

流式输出与人工审批

实时消费状态、事件、模型消息和自定义进度,并安全恢复中断

流模式

模式载荷典型用途
values每次提交后的完整状态UI 状态镜像、调试
updates节点/超步状态增量轻量进度更新
events带 sequence 和 metadata 的生命周期事件tracing、审计、Studio
customstream_writer(value) 写入的原始值token、业务进度
messages(AIMessageChunk/AIMessage, metadata)聊天 token 流
async for mode, chunk in graph.astream(
    input_state,
    context={"tenant": "acme"},
    stream_mode=["updates", "custom", "messages"],
):
    print(mode, chunk)

节点中的 custom 输出立即唤醒 consumer,无需等待节点完成或超步提交:

def retrieve(state, runtime):
    runtime.stream_writer({"stage": "searching"})
    docs = search(state["query"])
    runtime.stream_writer({"stage": "found", "count": len(docs)})
    return {"documents": docs}

流是观察通道,不参与 reducer。consumer 主动关闭 iterator 时,运行时会取消未完成任务并传播 cancellation token。

动态 interrupt

from lingxigraph import interrupt


def approve(state):
    decision = interrupt({
        "kind": "approval",
        "action": state["proposed_action"],
    })
    return {"approved": bool(decision["approved"])}

图必须配置 checkpointer 和稳定 thread_id。调用到 interrupt() 时会保存 checkpoint 并返回暂停状态;恢复时节点从开头重放,因此 interrupt 之前的副作用也必须幂等。

from lingxigraph import Command

config = {"configurable": {"thread_id": "ticket-42"}}
graph.invoke(initial, config=config)
graph.invoke(Command(resume={"approved": True}), config=config)

Agent Server 中,原 run 进入 paused,恢复会创建一个固定相同 graph/version/config/context 的新 run:

curl -X POST http://localhost:8124/v1/runs/$RUN_ID/resume \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"resume":{"approved":true}}'

只向审批者展示必要字段,不要把 secret、token 或完整敏感 state 放进 interrupt、event 或 trace。

On this page