说起来你可能不信,我写了个跑在浏览器里的 ai agent 框架

大家好啊我是 HOHO,最近搞了个小玩意出来给大家汇报一下。

前言

这两年大家一聊 agent 开发,默认脑子里浮现出来的基本都是服务端方案:

开发大头都在后端、上任务队列、上数据库、云函数、代理层,再来一套复杂到第二天自己都看不懂的编排系统。然后前端负责做个聊天框,点一下按钮,把请求发上去,把响应 show 出来就结束了。

当然哈,也不是说这种方案不对。但假设说,有些能力不在服务端呢?

比如说目前非常流行的各种 coding cli,本质上就是一个客户端 agent,各种逻辑和编排都是在本地处理的,而服务端只有很薄的一层 llm 封装。

为什么这么搞?因为能力都在客户端上,终端在本地、代码在本地、用户决策需要本地完成。你把这些逻辑放在后端,相当于绕了个大圈去解决问题。

那 web 端呢?

  • 阅读当前页面、告诉用户现在是在看什么,下一步该干什么。
  • 告诉用户他想要的功能在哪个路由
  • 直接调用前端已经有的 api 封装,直接代替 CURD 列表页
  • 利用一些注入特殊能力的 JS API(例如浏览器插件、office 插件)完成特定领域的任务
  • ...

诶?那么有没有一个 agent 框架,能够在浏览器这个客户端就把这些需求闭环掉?

所以这个项目就出来了:

它是干嘛的?

简单说,web-agent-runtime 是一个面向浏览器宿主环境的 agent runtime。

它就是用来实现上面提到的需求的。你可以把它理解成一个 coding agent,只不过跑在浏览器里。这个框架把一套 agent 真正跑起来时最麻烦的那部分东西准备好了,比如:

  • agent loop
  • 事件流
  • tool call
  • session 管理
  • 上下文压缩、分叉、steer、followup
  • 浏览器端持久化

但与此同时,它又该死的灵活和开放:

  • UI 你自己决定,框架只提供内核级的 api 和一套发布订阅的事件机制。React、Vue、Svelte、原生 js 都行。
  • 模型接入你自己决定,内置只给了一个方便本地验证的 OpenAI 兼容 provider。
  • 工具定义你自己决定,想操作页面、导航路由,调用 API都可以。
  • 数据存储你自己决定,开箱即用的提供一个基于 Indexdb 的存储,但是你可以通过接口把数据保存到任何位置。

怎么上手?

上手其实很直接:

bash 复制代码
npm install web-agent-runtime

然后你可以先用内置的 provider 和本地工具快速把东西跑起来:

ts 复制代码
import { createAgentRuntime } from "web-agent-runtime";
import { createLocalStorageTools } from "web-agent-runtime/local-storage";
import { createUnsafeOpenAiProvider } from "web-agent-runtime/unsafe-openai";

const agent = await createAgentRuntime({
  model: { id: "gpt-4.1-mini" },
  llmProvider: createUnsafeOpenAiProvider({
    apiKey: "your-api-key",
    baseUrl: "https://api.openai.com/v1",
  }),
  tools: createLocalStorageTools(),
});

这样一个可以自由读写 localstorage 的 agent 就开发好了:

ts 复制代码
const unsubscribe = agent.subscribe((event) => {
  console.log("assistant message:", event);
});

await agent.prompt("往 localStorage 里写入 demo:greeting=hello");

unsubscribe();
await agent.destroy();

当然这里要说清楚,createUnsafeOpenAiProvider 这个只是让你可以快速开发原型的哈,永远不要让 key 出现在前端逻辑里。生产环境你需要自己搞一个 llmProvider 对接到你的后端服务。

更多的什么会话管理、上下文操作这里就不赘述了,各位可以看项目或者直接让 ai 读 ts 声明。

你啥都提供了,我用这个包还需要干什么?

首先第一点,你需要根据后端接口开发一个 llm provider。

然后你需要根据自己的场景,写 system 提示词和开发一套 tool set。然后慢慢调教知道能满足你的业务需求。

就这些。这个包只实现了 agent 运行所需要的核心逻辑,业务层则完全交给你发挥创意。

用了什么技术?

项目整体是 TypeScript,核心包零运行时依赖 ,构建用 tsup,测试用 vitest

另外仓库里还带了一个 demo,可以直接拿来验证:

  • 浏览器侧工具调用
  • runtime event 流
  • session 创建和持久化
  • 模型输出渲染

如果你准备把它接进自己的产品里,先跑一下 demo,基本就能很快判断这套抽象是不是你要的。

最后

最后还要提一下,这个包并不是希望做一个新时代的 langchain 或者其他大包大揽的 ai 框架。它只是给在浏览器(以及各种 webview 或者纯 js 环境)提供一个运行 agent 的底层能力支持。

后端当然重要,但不是所有问题都该用同一套方案去解决。真正做过服务端 agent 的人应该都知道实现后台会话运行和用户确认有多恶心。

如果你正好就在做浏览器插件、内部系统助手,或者任何一种"能力主要长在前端"的 agent 产品,那这个项目可能能帮你少走不少弯路。

欢迎尝试,有问题随时 issue 或者评论区交流。

相关推荐
布列瑟农的星空7 小时前
类低代码平台的Agent开发实践(上)——文档助手
agent
格桑阿sir8 小时前
13-大模型智能体开发工程师:工具使用(Tool Use)范式
ai·大模型·agent·工具·智能体·tool·tool use
canonical_entropy8 小时前
为什么 Attractor Guided Engineering 不能被降级为 AI Agent Skill
架构·agent·ai编程
DreamWear8 小时前
用本地 LLM 写 commit,不消耗云端 token:git-courer 是怎么做到的
agent·ai编程
weiwin1239 小时前
MAF入门(3 下):多轮对话进阶——清除历史、注入 System、截断策略
人工智能·agent
XLYcmy9 小时前
面向Agent权限系统的快速审计工具
python·网络安全·ai·llm·飞书·agent·字节跳动
guyoung9 小时前
BoxAgnts 运行时(1)——运行时工程决定 Agent 未来
agent·ai编程
Artech9 小时前
[MAF的Agent管道详解-06]ChatClientAgent对IChatClient和输入输出增强管道的整合
ai·agent·maf·agent管道
程序员海军10 小时前
我用了 8 个月 Codex CLI,总结出这套 AI 编程工作流
前端·后端·aigc
武雄(小星Ai)11 小时前
Gemini CLI 免费用户6月18日停服,Google Antigravity 2.0 深度解读
运维·人工智能·agent