跳到正文
掘金· 吴凡wudianmei·· 12 天前精选AI 评分78

从 0 搭 AI Agent(四):SSE 跑通后三处契约错配与修复边界

从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界

AI 导读

文章拆解 AI Agent 的 SSE 链路跑通后仍会在后台持续消耗的三处契约错配,分别是 Starlette 0.49.1+ 快速路径假设 send() 在断开时抛 OSError 而 uvicorn 直接 return、异步生成器 running 状态下并发 aclose() 抛 RuntimeError 被 except Exception 吞掉、fetch-event-source 2.0.1 对 204 持续重试却把 clean close 当流结束。修复上给出无条件走 task-group 与 listen_for_disconnect 的 CancellableStreamingResponse、清理放 finally 且不在 finally 里 yield、onopen 识别 204 抛 FatalError 并自行实现递增退避。续传部分要求回放分支两条出口都补发带可解析 id 的 done,优雅关闭需在 lifespan 中尽早广播 sentinel 并调小 timeout_graceful_shutdown,幂等键要加 user_id 维度。作者给出验证方法,在生成器 yield 处打日志后中途关闭标签页,看服务端是否继续输出。

借鉴点

能拿走三处契约错配的具体修法,包括无条件走 task-group 的 CancellableStreamingResponse、finally 里不 yield 只重抛、204 抛 FatalError 并自算退避;落到 Agent 服务端 SSE 长连接这条线,代价是要按自己 uvicorn 小版本用日志实测,不能直接套结论。

来源:掘金 · juejin.cn