跳到主要内容

10 篇博文 含有标签「AI Agent」

查看所有标签

fetch + ReadableStream 实战:从 a2ui-full 拆一条 AG-UI SSE 全链路

· 阅读需 62 分钟

浏览器里那种「AI 一边想、界面一边长出来」的效果,落到代码其实只有两件事:

  • 服务端把一串事件写进一条不肯结束的 HTTP 响应;
  • 客户端从 response.body 里一块一块读出来,边读边解析、边渲染。

听起来像是一个下午就能写完的活。但真正把它接到 Agent 上,坑会集中在几个边界上:一次网络分片不等于一个事件、响应头发出之后状态码就改不了、连接关闭不等于任务完成、在错误的位置 throw 会让客户端永远等下去。这些都不是 API 会不会用的问题,而是「边界由谁负责」的问题。

这篇拿一个真实项目开刀:bigfe/encode_lesson/a2ui-full。它是一个 A2UI Playground——用户在网页里描述界面,Koa 服务端调用 LLM 生成 A2UI 协议,浏览器通过 fetch + ReadableStream 接收,边收边把界面渲染到右侧预览区。服务端用 @ag-ui/core 与 @ag-ui/encoder 组织事件,客户端手写 SSE 分帧,协议载荷则是 A2UI 的 JSONL。

我会按四条线拆:

  1. @ag-ui 是什么,它和 A2UI、MCP、A2A 各管哪一层;
  2. Node 端推 SSE 的完整步骤,从设置响应头到错误、取消、心跳;
  3. 客户端 fetch + ReadableStream 的完整步骤,从 getReader() 到分帧、解析、收尾;
  4. 这条链路里最值钱的十几个坑,其中几个是我在本机复现出来的,不是「听说」。

文中的实测脚本与官方文档原文都留档在 source/a2ui-sse-lab/。SSE 的基础格式、EventSource 与 fetch 的取舍,站内已经有两篇拆过——《SSE 是什么》与《EventSource 是什么,为什么 Agent 流式接收最后都换成了 fetch + ReadableStream》——这里不重复背景,只在需要的地方给出链接。

大模型流式 chunk 会因「网络波动」乱序吗?——TCP 的顺序保证,与「拼接 / 交错 / 截断」三件真身

· 阅读需 18 分钟

用 Node 搭 Agent 的人,几乎都问过同一句话:

大模型把 token 一帧帧吐回来,路上要过抖动、丢包、代理、网关——chunk 会不会乱序?我是不是得在客户端按时间戳重排一遍?

先给结论,三条:

  1. 一条流内部不会乱序。 这不是"概率很低",而是传输层的投递语义:IP 层确实会丢包、也可能乱序到达,但重排和去重由 TCP 承担,交给应用的永远是有序字节流。所以客户端既没必要重排,也没有重排的依据(你的 chunk 上并没有一个"网络序号"可排)。
  2. 你真正会踩的坑是另外三件事:分帧(chunk 边界不等于字符/帧边界,读错就烂码、丢帧)、交错(一个 Agent 同时跑多路流,合流看起来"跳")、截断(中途断流,拿到一段残文却以为写完了)。这三件里没有一件是"乱序"。
  3. 唯一真能"乱序"的地方,是写出顺序本身——而那时该修的是写出方,不是给客户端加一个重排器(它会忠实地把错误的顺序搬给你,也不会替你纠正)。

下面把规范逐字原文、7 组本机实测、生产清单都摆出来。全文的实测脚本随仓库留档在 source/sse-assembly-lab/(harness.mjs + harness.log),零依赖、不需要 API key,可复现。

EventSource 是什么,为什么 Agent 流式接收最后都换成了 fetch + ReadableStream

· 阅读需 33 分钟

「Agent 为什么都用 fetch + ReadableStream 读流?EventSource 不是也能收 SSE 吗?」

这个问题问得对,但流传的答案「大厂从 SSE 换成了 ReadableStream」说得不准。真实情况是:

EventSource 是浏览器内置的 SSE 客户端,它在「打开一个 URL、持续收通知」这件事上是满分答案。但 Agent 场景需要的几件事——发 POST、带请求头、看状态码——它一件也做不到,重连语义也完全不由你控制。于是大家保留了 SSE 的帧格式,只把「读它的那只手」换成了 fetch + ReadableStream。

这篇按这条线讲透:① EventSource 到底是什么 → ② 为什么 Agent 场景要换掉它 → ③ 换成 fetch + ReadableStream 之后怎么写(含可跑的最小实现)→ ④ 流式端点的三个生产雷区 → ⑤ 这套也不够用时,什么时候必须上 WebSocket / WebRTC。

正文的实测都在本机 Node 上跑出来,脚本随仓库留档在 source/stream-lab/。

高 ROI Agent 场景盘点:智能客服的 40 个百分点水分,与商业尽调的真实账本

· 阅读需 31 分钟

上一篇 开源 RAG 知识库横评 解决的是「底座用什么」。这篇往上走一层:底座之上,哪些 Agent 场景真的能赚钱。

这篇做四件事:先给一把判断「高 ROI」的尺子(厂商数字有三个系统性偏差)→ 深挖智能客服(含那个被反复引用的「76% 解决率」到底怎么回事)→ 深挖商业尽调(真实账本 + 一条不能碰的合规红线)→ 另外 8 个场景的落地水位表。

文中数字分三级标注:[已核实](直接读到原始文件/论文/采购公示)、[二手](权威第三方转述)、[厂商自述](厂商官网或案例页,无第三方验证)。标 [厂商自述] 的数字请勿当作 ROI 证据使用——这篇的大半篇幅其实是在解释为什么。

LangChain 还是 pi-agent?两套 Agent 框架的哲学差异(含同任务实测对照)

· 阅读需 9 分钟

「我该用 LangChain 还是自己写 / 换别的?」——这是开始做 Agent 时最常见的纠结。这篇把 LangChain(JS) 和 pi-agent 摆在一起比:不是比谁的 API 漂亮,而是比它们对「Agent 应该由谁来管」这件事的答案。

为了不空谈,我给同一类任务(一个会调工具的查天气 Agent)在两边各写了一份代码并真跑起来:pi 侧用内置的 fauxProvider(不需要 key),LangChain 侧用真实模型端点(DeepSeek 的 Anthropic 兼容接口)。文中的事件序列、消息序列、最终回答都是真实输出。

版本:@earendil-works/pi-ai / pi-agent-core 0.85.1;langchain 1.5.11 / @langchain/langgraph 1.4.15(2026-09 npm 实测)。本站已有两个系列:pi-agent 系列、LangChain + LangGraph 系列。

LangGraph 的 reducer 有几种模式?顺带把 Annotation 讲透

· 阅读需 8 分钟

在 LangGraph 入门 那篇里,我把 reducer 一笔带过:「(a,b)=>b 是覆盖,a.concat(b) 是追加」。但那只是两种写法,不是全部模式——真正的问题是:

同一个 key 被写入多次时,状态该怎么合?

这就是 reducer 要回答的唯一问题。这篇把它讲全:Annotation 的完整用法、reducer 的几种模式、它什么时候被调用、调用几次、以及我把每种行为都真实跑出来的结果(含两个报错,都是实测)。

声明:以下行为全部在 @langchain/langgraph 1.4.15(Node 24)跑出来的,输出是真实的。不同版本行为可能微调,以你的实际运行为准。

Coze 的「对话流模式」和「自主规划模式」到底差在哪

· 阅读需 8 分钟

用 Coze(扣子)搭智能体时,第一道选择题就是模式:单 Agent(自主规划模式) 还是 单 Agent(对话流模式)。很多人凭感觉选,然后在做的过程中反复返工——要么「流程搭得死死的,模型完全没发挥」,要么「让模型自己决定,结果它乱调工具」。

这篇把两者的底层机制差异讲清楚,并给一张选型表和几个常见坑。

先排一个术语雷:「对话流模式」是「智能体的运行模式」之一;而「对话流(Chatflow)」本身是一种「编排类型」(与「工作流 Workflow」相对)。这两个轴经常被混为一谈——本文会分别讲清,因为它们影响的是不同的选择。

内容依据 Coze 官方文档与公开资料整理,平台版本迭代快、不同版本 UI 命名有差异,具体以你所用版本的官方文档为准。

低代码二十年:从拖拽表单到编排 Agent——AI 时代低代码平台的现状与选型

· 阅读需 12 分钟

「低代码」这个词已经被喊了十多年,从「人人都能开发」的许诺,到被程序员吐槽「复杂了就做不了」,再到 2021 年前后的祛魅与退烧。而到了 AI 时代,它换了个马甲又回来了——Dify、Coze Studio、n8n 这些「编排 LLM 和工具」的平台,本质上就是新一代低代码平台,只是画布上的节点从「表单、审批」换成了「大模型、工具、知识库」。

这篇聊三件事:低代码的发展史、它当下的真实现状,以及 AI 时代这几家代表平台各自是什么、怎么选。

文中多数市场数据来自公开报道,统计口径与时点不一(尤其 star 数),已在文中标注时点,引用时请以官方为准。判断类观点是我的个人看法,欢迎拍砖。

ReAct 是什么:让模型「边想边做」的范式(含零依赖手写实现与 4 个实测坑)

· 阅读需 23 分钟

在写用前端技术栈写 Agent那几篇时,我把「工具调用循环」讲清楚了,但一直没单独讲它的出处。这个循环不是工程实践中自然长出来的,它有篇明确的论文:ReAct。

这篇把 ReAct 讲透:它是什么、为什么重要、格式长什么样,然后用零依赖的纯 Node 手写一个真的能跑的 ReAct 智能体。最后是重点——我在本机真实跑出来的四个坑,其中有两个非常隐蔽:一个是不报错、只是静默返回空,另一个是模型会伪造工具的返回结果,然后基于伪造值自信作答。

声明:本文所有代码均在本机真实运行,走 DeepSeek 的 Anthropic 兼容端点(deepseek-v4-flash,一个推理模型)。所有输出、stop_reason、token 数都是实测值,不是我编的示意。

OpenAI Codex 三大开源组件:exec、SDK、app-server 用法全解

· 阅读需 12 分钟

很多人以为"强大的 AI Agent = 好模型 + 好 Prompt"。但实际上,模型之上还叠着一整套底层执行系统(Harness):理解任务、维护对话记忆、调用工具、实时展示进度、处理失败、请求人类审批。这部分决定了 Agent 能不能真正"干活",也决定了把 Agent 嵌进产品时的体验上限。

OpenAI 在开源仓库 openai/codex 里把这套 harness 的三个组件开放了出来,分层恰好对应三种不同的接入方式:

组件形态一句话适合场景
codex execCLI 子命令非交互式跑完一个任务脚本、CI、一次性后台任务
Codex SDKTypeScript / Python 库在应用代码里启动/恢复/流式监听任务CI/CD、内部工具、应用集成
Codex app-server本地 JSON-RPC 服务把 Agent 变成你产品的"一等公民"持久对话、实时事件、打断、自定义工具、审批

下面逐个过用法,代码片段可以直接跑。