我花了3个月,把一个终端 AI Agent 搬进了浏览器——踩坑全记录
一、为什么要把终端 AI Agent 搬进浏览器2025年初我在终端里跑通了一个基于 LangChain 的 AI Agent能自动执行代码、调用工具、处理文件。功能很强大但每次演示都要打开终端、激活虚拟环境、敲命令——同事看了直摇头「这玩意儿能不能在浏览器里点一下就跑」于是我决定花3个月时间把这个终端 AI Agent 完整地搬到浏览器里。这篇文章记录了我踩过的所有坑希望能帮你少走弯路。二、技术选型从 WebSocket 到 Web Worker第一个问题就是终端里的 Agent 是 Python 写的浏览器里跑不了 Python。怎么办方案一后端代理 WebSocket最直接的想法后端起一个 Python 进程浏览器通过 WebSocket 发送指令后端执行后把结果推回来。这个方案我用了两周踩了三个坑连接管理每个用户一个进程服务器内存直接爆炸状态同步Agent 的中间状态思考链、工具调用很难实时推给前端断连恢复浏览器刷新一下Agent 状态全丢了方案二WebAssembly Python 运行时用 Pyodide 在浏览器里直接跑 Python试了之后发现Pyodide 不支持 subprocessAgent 调不了系统命令等于废了一半。方案三前端重写 Web Worker最终方案用 TypeScript 重写 Agent 核心逻辑在 Web Worker 里运行。Worker 里跑 Agent 循环主线程只负责渲染 UI。这样既解决了进程管理问题又天然支持断连恢复——Worker 在页面关闭前一直活着。三、踩坑实录那些让我熬夜的 Bug坑1Web Worker 里的异步陷阱Agent 的核心是循环调用 LLM每次调用都是异步的。在 Worker 里写异步循环时我犯了一个经典错误// 错误写法循环里直接 await导致事件循环阻塞 while (true) { const result await callLLM(messages); messages.push(result); } // 正确写法用递归 setTimeout 让出事件循环 function agentLoop() { callLLM(messages).then(result { messages.push(result); if (!isDone) setTimeout(agentLoop, 0); }); }这个 Bug 让我排查了两天最后用 Chrome DevTools 的 Performance 面板才发现事件循环被阻塞了。坑2流式输出的渲染性能Agent 的思考过程是流式输出的每生成一个 token 就要更新一次 UI。一开始我用 React 的 setState 直接更新结果页面卡成 PPT。解决方案用requestAnimationFrame做节流每 16ms 批量更新一次 DOM。同时把长文本用contenteditable的选区操作来增量插入避免全量替换。坑3工具调用的沙箱隔离Agent 需要执行代码、读写文件但在浏览器里不能直接操作文件系统。我用了OPFSOrigin Private File System来做沙箱文件系统用iframe sandbox来执行用户代码。但 OPFS 的 API 是异步的Agent 的工具调用却是同步的至少从 Agent 的角度看。最后我封装了一个ToolBridge把异步操作包装成 PromiseAgent 通过await bridge.call(writeFile, ...)来调用。四、架构演进从单体到微前端项目做到第二个月代码量已经超过 2 万行。Agent 核心、工具系统、UI 组件、状态管理全部耦合在一起改一个地方崩一片。我做了三件事来解耦Agent 核心独立成包用agent/core管理 LLM 调用、思考循环、记忆管理工具系统插件化每个工具是一个独立的ToolPlugin通过接口注册到 AgentUI 层用微前端Agent 面板、文件浏览器、终端模拟器各自独立部署通过iframe postMessage通信五、性能优化从 5 秒到 500 毫秒搬进浏览器后最直观的问题是慢。终端里秒回的 Agent在浏览器里要等 5 秒才有反应。优化路径LLM 调用缓存相同的 prompt 组合直接走缓存减少重复请求Web Worker 预热页面加载时提前初始化 Worker用户点击「开始」时直接跑虚拟滚动Agent 的思考日志可能很长用虚拟滚动只渲染可视区域增量序列化Agent 状态用structuredClone做快照但只序列化变化的部分六、总结与建议3 个月下来我最大的感受是把终端工具搬进浏览器不是简单的「换个 UI」而是整个架构的重构。给想尝试的同学几点建议先想清楚边界哪些逻辑必须在浏览器里跑哪些可以放后端Web Worker 是你的朋友别在主线程里跑 Agent 循环做好状态持久化浏览器刷新是常态用 IndexedDB 存 Agent 状态性能监控要早做别等用户反馈卡顿才去排查最终成果是一个可以在浏览器里直接运行的 AI Agent 演示平台支持代码执行、文件操作、API 调用等 20 工具。虽然过程痛苦但看到用户在浏览器里点一下就能跑通 Agent一切都值了。

相关新闻

吃透这 17 个概念,比 95% 的开发者更懂 AI

吃透这 17 个概念,比 95% 的开发者更懂 AI

1. 机器学习机器学习是人工智能的核心分支,指让计算机通过数据自动学习规律和模式,而不需要显式编程。它分为监督学习、无监督学习和强化学习三大类。理解机器学习是进入 AI 世界的第一道门槛。2. 深度学习深度学习是机器学习的一个子集,基于…

2026/7/19 17:27:45 阅读更多 →
500万-500w - 青龙面板自动签到脚本

500万-500w - 青龙面板自动签到脚本

自动抽奖、消息推送。这款自动化脚本帮你完成平台的日常签到和任务,解放双手,再也不用每天手动操作。功能介绍 「500万-500w」脚本支持以下功能: • 自动完成每日签到 • 自动领取奖励 • 支持多账号 • 签到结果通知 使用方法 1. 下载脚本并…

2026/7/19 17:27:45 阅读更多 →
Rapid SCADA开发指南:自定义工业监控功能的完整教程

Rapid SCADA开发指南:自定义工业监控功能的完整教程

Rapid SCADA开发指南:自定义工业监控功能的完整教程 【免费下载链接】scada Contains Rapid SCADA sources 项目地址: https://gitcode.com/gh_mirrors/sc/scada Rapid SCADA是一款功能强大的开源工业监控与数据采集系统,专为自动化工业控制系统设…

2026/7/19 17:26:44 阅读更多 →

最新新闻

互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:40 阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:13:39 阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:12:39 阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:12:39 阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:12:39 阅读更多 →
2026年具身智能领域代表性机器人产品观察:普渡一脑多形底座与实景落地解析

2026年具身智能领域代表性机器人产品观察:普渡一脑多形底座与实景落地解析

前言2026年被行业视为具身智能从"实验室炫技"走向"规模化量产"的关键拐点。据弗若斯特沙利文《全球商用服务机器人市场研究报告》,普渡科技以23%市占率位居全球商用服务机器人第一,业务覆盖85+个国家和地区,累…

2026/7/20 0:11:39 阅读更多 →

日新闻

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:00:34 阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:00:34 阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:00:34 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻