唉,上个月被裁员了,在求职过程中,我发现了一个残忍的现实,前端真的要失业了,目前很多岗位都要求ai agent 能力,奈何这方面确实不足,因此作者去研究了一番,做了一个本地的agent,(想要在前端领域苟延残喘一番)。这个agent 处于初期,并不完善,但是作为新手摸索和学习足够了。
项目支持两种模式,本地模型和在线api,同时集成了一部分工具,用户还可以编写skill。 有兴趣的可以参考
项目地址github.com/fangzhouzhu… 欢迎star和二次开发,后续项目还会逐渐完善。
为啥选择Ollama ?
因为本地部署不用花钱!!!,当然你可以使用在线的api 。
话不多数,先上图。
配置界面
rag
下面的介绍由ai 生成
说实话,这段时间 AI 产品看了很多,聊天机器人也用了不少,但总有一个问题让我很难受:
能聊的不一定能干活,能干活的往往又不够顺手。
所以我就想,干脆自己做一个:
- 放在桌面上,随时打开就能用
- 不只是聊天,还能读写文件、分析文档、联网搜索
- 能接本地模型,也能切第三方大模型
- 最重要的是,整个过程我自己可控、可扩展
于是,这个项目就这么一点点做出来了。
它不是一个“只能陪你聊天”的 AI,而是一个更像本地工作台的 Agent。
一开始,我想做的其实很简单
最开始的目标就 3 个:
- 先把对话跑起来
- 让它能调用工具
- 让它能看懂我上传的文件
技术栈也选得比较直接:
- Electron:做桌面端壳子
- React + TypeScript:做界面
- LangChain:负责大模型调用和工具编排
- Ollama:负责本地模型运行
- OpenAI-Compatible API:兼容第三方在线模型
- MemoryVectorStore + Embeddings:做 RAG 检索
这个组合的好处是:本地优先、开发快、后续扩展空间也大。
第一步:先把“像 ChatGPT 一样聊天”做出来
这个阶段没追求花活,重点就是把链路打通:
- 前端输入消息
- Electron 主进程接收
- 调用本地模型
- 流式把结果回传到界面
为了保证桌面应用的安全性,我把权限分层做得比较清楚:
renderer负责 UIpreload通过contextBridge暴露有限 APImain负责真正的能力调用
这样做完之后,最基础的聊天就有了,而且还是流式输出的,体验上已经很接近一个成品了。
第二步:让它不只是“会说”,还得“会做”
光聊天没什么意思,Agent 的灵魂其实在 工具调用。
所以我给它加了一批常用工具:
- 读取文件
- 写入文件
- 删除文件
- 搜索文件
- 列出目录
- 获取当前时间
- 数学计算
- 单位换算
- 联网搜索
- 抓取网页
- 查询天气
- 汇率转换
这一步做完之后,整个项目一下子就“活了”。
比如你不再是问它:
“怎么查当前目录?”
而是可以直接说:
“帮我看看这个目录里有哪些文件”
“把这个内容写到某个文件里”
“帮我算一下 2354×34”
“查一下今天北京天气”
这时候它已经不只是一个聊天框,而是一个会执行任务的桌面助手了。
第三步:加上 RAG,让它能分析你自己的文件
这是我觉得整个项目最有意思的一部分。
因为很多时候,我们真正想问的不是“通用知识”,而是:
- “帮我总结这份 PDF”
- “这个文档的重点是什么”
- “这个 Word 里提到的结论在哪一页”
- “把我上传的资料做个归纳”
所以我做了一个很实用的 RAG 流程:
- 支持上传
txt / md / pdf / docx / csv / json / ts / js - 解析文本内容
- 切分 chunk
- 用
nomic-embed-text做向量化 - 存进内存向量库
- 提问时只从当前文件里检索相关上下文来回答
这一步之后,项目的定位就从“桌面聊天工具”升级成了:
本地知识问答 + 文档分析工作台
而且我还专门处理了一个很烦的坑:
旧文件上下文污染新文件回答。
后来我给每一轮 RAG 会话加了 ragContextId 做隔离,重新上传或移除文件后,不会再串上下文了。
第四步:一个模型不够,那就做“自动路由”
做着做着就发现,不同场景其实适合不同模型:
- 普通闲聊,轻一点的小模型就够了
- 工具调用、代码分析,需要更强一点的模型
- 文档问答,又是另一种场景
于是我把模型拆成了三条路由:
chat:普通对话agent:复杂任务 / 工具调用rag:文档问答
然后再根据消息内容自动判断该走哪条路。
后面我又往前推了一步:
不仅支持 本地 Ollama 模型,还支持 在线第三方模型。
也就是说,你现在可以:
- 本地用
qwen/llama/deepseek - 在线接
OpenAI - 接
Moonshot - 接
DeepSeek - 接
SiliconFlow - 接
OpenRouter - 甚至接 智谱 AI
而且这些都能放到设置里统一配置。
第五步:再往前一步,做 Skills,让它更像“专长助手”
工具有了,模型也能切了,但我还想让它更“懂场景”。
所以我又加了一个 Skills 配置中心,支持本地配置:
- 技能名称
- 描述
- 关键词
- 优先级
- 系统提示词
- 优先路由场景(chat / agent / rag / auto)
比如你可以自己配:
- 写作助手
- 代码助手
- 文档分析助手
- 产品经理助手
- 联网研究助手
这样一来,它不只是“能干活”,而是会根据你的配置,用不同方式干活。
这一步是我自己特别喜欢的,因为它让整个项目从“功能堆叠”变成了“可定制工作流”。
第六步:把体验打磨到“真能天天用”
功能有了之后,我开始处理那些最影响体验的小细节:
- 每条回复下面显示当前模型 / 路由场景
- 工具调用结果做成更易读的卡片
- 增加“思考与执行过程”面板
- 上传文档时显示处理进度
- 代码块支持复制
- 链接点击后走系统默认浏览器
- 上滑时底部出现“回到底部”按钮
- 设置页拆成 模型配置 和 Skills 配置 两个 Tab
这些功能单看都不大,但加在一起之后,整个产品的完成度提升非常明显。
你会发现,它已经不是一个 demo 了,而是一个可以持续迭代的桌面应用。
现在,这个项目已经能做什么?
一句话总结:
这是一个支持本地模型、在线模型、工具调用、RAG、Skills 配置、多会话持久化的桌面 AI Agent。
目前已经支持:
✅ 对话能力
- 普通多轮聊天
- 流式输出
- 多会话管理
- 本地历史持久化
✅ Agent 能力
- 文件读写 / 搜索 / 删除
- 时间、天气、汇率、计算
- 网页抓取、联网搜索
- 工具执行过程可视化
✅ RAG 能力
- 上传 PDF / Word / Markdown / 代码文件
- 自动切片与向量化
- 基于当前文档上下文问答
- 文件上下文隔离,避免串内容
✅ 模型能力
- 本地 Ollama 模型切换
- 第三方在线模型接入
- 场景化模型路由
- 预设保存与一键切换
✅ 可配置能力
- Skills 技能中心
- 本地提示词管理
- 优先级与关键词触发
- 按场景分配不同工作方式
这次做完,我最大的感受是:
以前我总觉得 AI Agent 离“真正能用”还有点远。
但自己一步一步做下来之后,反而越来越确定一件事:
Agent 不一定非得是一个庞大、复杂、全自动的系统。
很多时候,只要它能解决你真实的日常工作问题,它就已经很有价值了。
而这个项目,正是朝着这个方向一点点长出来的:
- 从聊天开始
- 到工具调用
- 到文档理解
- 到模型路由
- 到 Skills 工作流
- 再到真正能用的桌面体验
它还远没到终点,但已经足够让我每天愿意打开它。
结尾
如果你也想做一个不是只会聊天,而是真的能帮你处理事情的 AI Agent,
那 Electron + React + LangChain + Ollama 这条路,真的很值得试。
自己做一遍,你会对“AI 能落地到什么程度”有完全不一样的理解。
如果这篇文章你觉得有帮助,欢迎交流。
我后面也准备继续把它往下面几个方向做:
- 向量索引持久化
- 更完整的工具权限控制
- 更强的工作流编排
- 插件化 skills / tools 体系