尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

langgraph sse 用法

langgraph sse 用法
📅 发布时间:2026/6/18 23:23:41

目录
  • 一、语法层面:Python 允许函数内定义函数(包含 async)
  • 二、运行时语义:这是一个「闭包 + 工厂函数」模式
    • 1️⃣ event_stream 不是立即执行的
    • 2️⃣ 为什么要嵌套,而不是单独定义?
    • 3️⃣ 如果不嵌套,会发生什么?
  • 三、在 FastAPI + SSE 中,这是「惯用模式」
    • FastAPI 官方与社区常见写法
  • 四、从设计角度看,你的写法是「高质量的」
    • 这是一种明确的设计边界
  • 五、再强调一次:这不是“偷懒写法”,而是刻意设计
  • 一句话总结

这是 Python 的语言特性,而且在你这段代码里,嵌套 async def 是一个非常合理、工程上正确的设计选择。下面我从「语法层面 → 运行时语义 → 为什么在 FastAPI + SSE 中尤其常见」三个层次解释。


一、语法层面:Python 允许函数内定义函数(包含 async)

在 Python 中:

  • def 可以出现在任何可执行作用域中
  • async def 本质上仍然是函数定义,只是返回 协程函数
  • 因此:
async def outer():async def inner():...

是完全合法的

这和 Java / Go 不同,Python 是支持闭包(Closure)的动态语言。


二、运行时语义:这是一个「闭包 + 工厂函数」模式

关键点在于这一句:

return StreamingResponse(event_stream(),media_type="text/event-stream",
)

1️⃣ event_stream 不是立即执行的

event_stream()

返回的是一个:

AsyncIterator[str](异步生成器)

它会在 FastAPI / ASGI 框架真正开始向客户端写数据时 才被消费。


2️⃣ 为什么要嵌套,而不是单独定义?

因为 event_stream 天然依赖外部上下文变量:

外部变量 来源
request HTTP 请求体
thread_id 本次请求生成
last_content 请求最后一条消息
langfuse trace 与当前请求绑定
logger / callback 请求级上下文

这些变量:

thread_id
last_content
request
lf_callback
langfuse

在 event_stream 内部直接可用,因为:

Python 会把它们捕获为 闭包变量

这是一个非常标准的闭包模式。


3️⃣ 如果不嵌套,会发生什么?

你只能写成这样:

async def event_stream(request, thread_id, last_content, ...):...

然后在外部:

return StreamingResponse(event_stream(request, thread_id, last_content, ...),
)

这会带来几个问题:

  1. 参数极多,接口污染
  2. SSE 是强请求绑定逻辑,却变成“公共函数”
  3. trace / callback / logger 很容易被误用成全局态
  4. 可读性显著下降

三、在 FastAPI + SSE 中,这是「惯用模式」

你这段代码本质是:

“为当前 HTTP 请求,动态生成一个只属于它的异步事件流函数”

这是 SSE 的本质需求。

FastAPI 官方与社区常见写法

@app.get("/stream")
async def stream():async def event_generator():for i in range(10):yield f"data: {i}\n\n"await asyncio.sleep(1)return StreamingResponse(event_generator())

你现在做的只是 工程级加强版:

  • 多 Agent Graph
  • LangGraph astream
  • Langfuse trace
  • SSE 多事件类型

四、从设计角度看,你的写法是「高质量的」

这是一种明确的设计边界

层级 职责
customer_service_chat HTTP 入口 / 参数校验 / Response 封装
event_stream 本次请求的 执行生命周期
Graph / Agent 业务执行

event_stream 的生命周期 == 一个 HTTP 连接

这点用嵌套函数表达得非常清楚。


五、再强调一次:这不是“偷懒写法”,而是刻意设计

你这里用嵌套 async def,实际上同时实现了:

  • 闭包(request-scope state)
  • 请求隔离
  • 避免全局状态污染
  • SSE 延迟执行
  • Langfuse trace 正确归属

在 高并发 + 流式 + 可观测性 场景下,这是推荐做法。


一句话总结

customer_service_chat 里嵌套定义 event_stream,是利用 Python 的闭包机制,为每个 HTTP 请求动态创建一个只属于它的异步事件流执行器。

在 FastAPI + SSE + LangGraph + Langfuse 这种架构下,这是正确、清晰、可维护的工程实践,而不是语法“怪招”。

如果你愿意,下一步我可以帮你 判断这个 @observe 放在 event_stream 上是否是最佳位置,以及 root trace 是否如你预期那样工作。

相关新闻

  • 9.23
  • 为什么你的手势识别总延迟?Open-AutoGLM缩放参数调优指南
  • Open-AutoGLM操作手册导出实战指南(99%工程师忽略的核心细节)

最新新闻

  • 终极指南:用HoYo-Glyphs轻松获取11款米哈游游戏字体
  • CSM 模块完整讲解
  • Magistral Small:可解释逻辑推理模型本地部署指南
  • 揭秘AI写专著:AI专著写作工具大推荐,20万字专著轻松搞定!
  • 终极指南:如何在macOS上使用Whisky高效运行Windows应用
  • AI治理利益相关方分析:动态权力网络的实战测绘方法

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号