如何实现SSE流式推送与并行抓取?TinyFish Cookbook之game-buying-guide完整深度解析
如何实现SSE流式推送与并行抓取TinyFish Cookbook之game-buying-guide完整深度解析【免费下载链接】tinyfish-cookbookA collection of sample apps and recipes built with the TinyFish web agent. Open-source examples for you to learn build!项目地址: https://gitcode.com/gh_mirrors/ti/tinyfish-cookbook本文带你完整拆解 TinyFish Cookbook 中的开源示例game-buying-guide它是一个 AI 游戏比价助手通过SSE 流式推送11 路并行抓取让 10 个浏览器 Agent 同时访问 Steam、Epic、GOG 等游戏商店并实时回传价格分析结果。下面从架构、并发、流式协议到客户端解析一次讲透它的代码设计。一、它是什么一个能同时逛 11 个商店的 AI 比价工具game-buying-guide 的目标很直接输入一个游戏名它立刻派出 11 个 TinyFish 浏览器 Agent并行执行10 个商店 AgentSteam、Epic Games、GOG、PlayStation、Xbox、Nintendo eShop、Humble Bundle、Green Man Gaming、Fanatical、CDKeys1 个 SteamDB Agent专门抓取该游戏的历史最低价格判断现在是买还是等每个 Agent 返回结构化 JSON现价、折扣、评分、buy_now / wait / consider建议最先完成的平台最先显示在页面上——这正是 SSE 流式推送的价值所在。二、总体架构三个 API 路由组成流水线项目结构见 game-buying-guide/README.md核心只有 3 个 API 路由路由职责是否流式discover-platforms/route.ts返回 10 个商店的搜索 URL硬编码模板无需 LLM❌ 普通 JSONanalyze-platform/route.ts单个商店的 Agent 分析✅ SSE 流式steamdb-price-history/route.tsSteamDB 历史最低价分析✅ SSE 流式设计亮点平台发现用硬编码 URL 模板route.ts#L4-L55省掉一次 LLM 调用的等待只有真正需要看网页的环节才交给浏览器 Agent。整个项目无数据库、无缓存纯内存实时抓取。三、并行抓取核心Promise.allSettled 同时发起 11 个任务客户端状态全部集中在 hooks/use-game-search.ts 这个自定义 Hook 里。search函数是并行抓取的入口// 所有平台 Agent SteamDB 并行执行 await Promise.allSettled([ ...platforms.map((platform) analyzePlatform(platform, gameTitle)), analyzeSteamDB(gameTitle), ]);见 use-game-search.ts#L186-L189。这里有两个关键选择Promise.allSettled而非Promise.all任何一个商店 Agent 超时或失败都不会拖垮其余 10 个任务失败的那张卡片单独显示错误状态。每个任务独立持有AbortController见 use-game-search.ts#L22-L23用户重新搜索或点击重置时可以精确中止某一路 SSE 连接避免旧请求污染新结果。四、SSE 服务端实现ReadableStream 四行事件头analyze-platform路由的精髓只有几十行。它用ReadableStream构造响应体把 Agent 事件逐条编码为 SSE 格式data: {JSON}\n\n写入const stream new ReadableStream({ async start(controller) { const send (payload) controller.enqueue(encoder.encode(sseData(payload))); // 把 TinyFish 事件流逐条转成 SSE 帧发送…… }, });完整实现见 route.ts#L70-L118。响应头中有 4 个保证流式体验的关键设置Content-Type: text/event-stream Cache-Control: no-cache, no-transform Connection: keep-alive X-Accel-Buffering: no ← 禁止 Nginx 类代理缓冲数据即刻下发另外注意 route.ts#L4-L5 的maxDuration 300浏览器 Agent 爬取慢必须把云函数超时时间拉长到 5 分钟否则流会在中途被掐断。三种 SSE 事件类型客户端只会收到 4 种帧全部由服务端事件映射而来SSE 帧类型来源TinyFish SDK 事件用途STREAMING_URLEventType.STREAMING_URL拿到 Agent 浏览器的实时画面地址STATUSEventType.PROGRESS更新卡片上的正在做什么文案COMPLETEEventType.COMPLETERunStatus.COMPLETED返回解析后的价格分析 JSONERROR异常分支携带错误信息前端标记卡片为失败五、最大亮点STREAMING_URL 驱动的实时浏览器预览STREAMING_URL事件是这套架构最出彩的部分TinyFish 会把 Agent 浏览器的实时画面地址流式推给前端前端直接用iframe加载用户就能亲眼看到 AI 正在哪个商店页面上翻找价格。卡片内嵌预览components/agent-card.tsx 中运行中的卡片带一块 128px 高的实时窗口点击可放大为悬浮窗components/live-browser-preview.tsx 用 Framer Motion 实现展开/收起上图是同一 Cookbook 仓库中 fast-qa 示例应用的截图——同样基于 TinyFish Agent 流式回传能看到边执行、边更新的交互质感game-buying-guide 的每张卡片都是这种体验。六、客户端 SSE 解析手写 30 行解析器前端没有用EventSource它不支持 POST而是手写了一个极简解析器核心逻辑在 use-game-search.ts#L40-L74response.body.getReader()按块读取响应体用TextDecoder解码buffer 保留最后一个不完整行SSE 帧可能被网络拆包按\n切行只处理以data:开头的帧JSON.parse后按type字段分发到对应的状态更新。解析失败直接catch跳过坏块保证流不被一条脏数据中断。所有数据结构定义在 lib/types.tsAgentStatus每路任务状态机pending → running → complete/error与PlatformAnalysis比价结果字段。七、一个容易被忽略的细节COMPLETED ≠ 任务成功服务端对结果做了双重校验见 route.ts#L85-L96状态校验RunStatus.COMPLETED只代表浏览器没崩不代表真的取到了价格内容校验Agent 可能返回带 json 围栏的字符串需先清洗再JSON.parse解析不出来时回退到兜底对象recommendation: consider前端永远不会白屏。这是所有 Agent 应用的通用经验永远校验内容而不只是状态。八、本地运行这份示例git clone https://gitcode.com/gh_mirrors/ti/tinyfish-cookbook cd tinyfish-cookbook/game-buying-guide # 需要 Node.js 22.x npm install # 创建 .env.local填入 TINYFISH_API_KEY npm run dev打开 http://localhost:3000输入任意游戏名即可看到 11 张卡片从运行中逐步变为完成实时画面、进度文案、比价结果依次流式呈现。总结这套架构最值得抄的 4 个点⚡并行用allSettledN 路任务互不牵连失败只影响单卡SSE 用ReadableStream手写POST 场景下比EventSource更灵活客户端解析器仅需 30 行️STREAMING_URL事件转发 iframe把AI 在干活变成可视过程体验远超转圈 loading✅COMPLETED 后仍校验内容Agent 结果永远需要清洗 兜底完整源码可直接参考 game-buying-guide/ 目录更多基于 TinyFish 的实战示例都在 Cookbook 仓库的 README.md 中有索引。【免费下载链接】tinyfish-cookbookA collection of sample apps and recipes built with the TinyFish web agent. Open-source examples for you to learn build!项目地址: https://gitcode.com/gh_mirrors/ti/tinyfish-cookbook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

linux部署jdk+tomcat 启动服务

linux部署jdk+tomcat 启动服务

linux部署jdktomcat 启动服务 在麒麟 ARM 离线环境里:JDK 选 aarch64 版本、Tomcat 用官方 tar.gz、通过 setenv.sh 指向 JDK。 1,安装 jdk 1.1 下载jdk # 在离线服务器上执行,确认架构 uname -m # 输出应为 aarch64浏览器根据服务器架构…

2026/11/12 18:43:09 阅读更多 →
Unity网络通信最稳方案:从零手写异步TCP客户端与粘包拆包处理

Unity网络通信最稳方案:从零手写异步TCP客户端与粘包拆包处理

做Unity客户端的朋友,早期应该都踩过这样的坑:需要跟服务器通信,于是直接在Update里写了个Socket.Receive,结果网络一抖动,整个游戏画面就像PPT一样卡。或者网上找教程,用协程把接收包循环包起来&#xff0…

2026/11/10 5:15:25 阅读更多 →
Unity内嵌浏览器ZFBrowser实战指南:数字孪生与网页交互

Unity内嵌浏览器ZFBrowser实战指南:数字孪生与网页交互

做数字孪生项目时我遇到一个很典型的需求:要在Unity场景里嵌入一个实时网页仪表盘,用户可以一边看3D设备状态,一边滚动查看网页上的数据图表。一开始我走的是UITexture加浏览器截图的野路子,结果延迟高、不能点击、页面一滚动就卡…

2026/11/11 16:52:04 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻