我用Flutter做了一个AI助理App, 能让大模型真正“看见“你的手机-DWeis2.0.0上线
DWeis2.0.0上线
不是聊天机器人,是一个能帮你操作浏览器、管理文件、安排日程、跨 Agent 协作的 Android 助理。开源,MIT 协议,可运行。
先看它能做什么
| 场景 | 例子 |
|---|---|
| 🌐 浏览器自动化 | “帮我在 GitHub 搜 Flutter 项目,按 star 排序,把前 3 个链接发给我” — 它能打开浏览器、输入搜索、滚动页面、提取结果 |
| 🧑🤝🧑 Agent 群聊 | “你们三个 Agent 分别调研 Flutter、React Native、Kotlin Multiplatform 的优缺点,汇总给我” — 协调者自动派活,子 Agent 隔离执行 |
| 📝 笔记 + 记忆 | “把我上周讨论的项目方案记下来” — 自动写入 MEMORY.md,下次对话自动 recall |
| 🔍 深度搜索 | “搜一下 2026 年 Flutter 3.0 的新特性,结合官方文档和社区评价给我总结” |
| 📅 计划 + 提醒-目前是beta测试中 | “帮我做一个本周学习 Flutter 的计划,每天晚上 8 点提醒我” |
| 🎨 图片/视频生成 | “帮我生成一张 Flutter 架构图的封面图” |
这个项目是什么
personal-agent-app(也叫 DWeis)是一个 Android AI 助理应用,基于 Flutter 构建。
它不是一个简单的AI对话app,而是把 AI 能力和手机系统能力深度集成——大模型不仅能聊天,还能真正帮你操作手机。
技术栈:
- Flutter 3.27 + Dart 3.9
- 状态管理:get_it + ChangeNotifier
- 本地存储:SQLite
- 浏览器:Android WebView + 虚拟显示合成
- 协议:OpenAI / Anthropic / DeepSeek 全兼容
核心功能详解
一、40+ 内置工具:大模型的"手和脚"
项目目前有 40+ 个内置工具,分 7 大类:
| 类别 | 工具 | 实际例子 |
|---|---|---|
| 🌐 浏览器 | goto / click / type / screenshot / snapshot / search / getText / evaluate | “打开 GitHub,搜索 personal-agent-app,截个图给我看” |
| 🔍 搜索 | searxng.search / tavily.search / web.fetch / deep_search | “深度搜索 Flutter 3.0 新特性,给我一份技术总结” |
| 📁 文件系统 | read / write / ls / mkdir / rm | “把项目 README 的内容读给我听” |
| 📝 笔记 | create / update / read / list / delete / search | “创建一篇笔记,标题是 Flutter 学习计划,内容是…” |
| 📅 计划 & 提醒-目前是beta测试中 | plan.create / update / advance / verify / reminder / calendar | “创建一个本周学习计划,每天提醒我” |
| 🧠 上下文文档 | SOUL.md / USER.md / MEMORY.md | “记住我叫小明,以后叫我小明就行” |
| 🤖 Agent 调度 | delegate.task | “把这个任务派给前端 Agent” |
工具调用机制:不是用户手动选择工具,而是大模型根据对话内容自主决定何时调用、调哪个、怎么传参。用户只需要说"帮我查一下…",背后的工具调用完全透明。
二、内置浏览器:大模型能"看见"网页
这是项目最有差异化的功能之一。
不只是打开网页,而是让大模型真正理解页面内容并执行操作:
例子 1:自动搜索
用户:帮我在 CSDN 搜 "Flutter 终端",把前 5 篇的标题和链接发给我
AI 执行:
1. browser.goto("https://so.csdn.net/so/search?q=Flutter终端")
2. browser.snapshot() → 获取页面可交互元素树
3. 分析快照,提取搜索结果列表
4. 返回结构化结果给用户
例子 2:自动填表
用户:帮我在 GitHub 上搜 "personal-agent-app",打开第一个结果,截个图
AI 执行:
1. browser.goto("https://github.com/search?q=personal-agent-app")
2. browser.snapshot() → 找到第一个搜索结果
3. browser.click("第一个结果的链接")
4. browser.screenshot() → 截图返回
浏览器工具的能力清单:
| 能力 | 说明 |
|---|---|
| 导航 | goto / back / close / scroll / wait |
| 交互 | click / type / select / hover / fillForm / evaluate |
| 数据 | snapshot / getText / search / cookies / config |
| 视觉 | screenshot → 截图直接嵌入对话气泡 |
关键实现:页面快照(snapshot)会把当前页面的可交互元素提取成 YAML 格式的结构化数据,大模型分析这个结构决定点击哪个元素。配合 screenshot,模型能同时看到页面布局和元素结构。
三、Agent 群聊:多个 AI 同场协作
不是单 Agent 单打独斗,而是多个 AI 像团队一样协作。
架构设计:
用户输入
↓
协调者 Agent(Coordinator)
↓
├── 派活给 Agent A(前端调研)
├── 派活给 Agent B(后端调研)
└── 派活给 Agent C(性能分析)
↓
汇总结果 → 返回用户
关键特性:
- 混合调度 — 既支持用户
@某个Agent点名回复,也支持协调者自动推举最合适的 Agent 发言 - 身份隔离 — 每个 Agent 只看到自己与用户的对话,其他 Agent 的发言作为上下文注释,不串身份
- 独立配置 — 每个 Agent 有独立的 system prompt、工具白名单、AI 后端
- 最多 5 轮接力 — 防止无限循环
实际例子:
用户:帮我评估一下用 Flutter 做这个项目的技术方案
协调者:
1. 先问用户几个澄清问题(目标平台、团队规模、性能要求)
2. 用户回答后,派活给三个 Agent:
- Agent A(架构师):评估 Flutter 架构合理性
- Agent B(前端):评估 UI/UX 实现难度
- Agent C(运维):评估构建和发布流程
3. 三个 Agent 并行返回结果
4. 协调者汇总成一份技术评估报告
四、记忆系统:AI 记得你
项目有三层记忆,都在本地存储:
| 文档 | 作用 | 例子 |
|---|---|---|
| SOUL.md | AI 人格设定 | 名称、语气、风格、背景故事 |
| USER.md | 用户资料 | 称呼、偏好、习惯 |
| MEMORY.md | 跨会话长期记忆 | 重要决定、项目约定、过往事实 |
实际例子:
第一次对话:
用户:我叫小明,是做 Flutter 开发的
AI:好的小明,以后就这么叫你。你的 Flutter 项目是用什么架构?
(系统自动写入 USER.md 和 MEMORY.md)
第 10 次对话(一周后):
用户:我那个项目最近遇到一个问题...
AI:你上周提到过,你用的是 get_it + ChangeNotifier...
(自动 recall MEMORY.md 里的上下文)
记忆系统有个硬约束:写前必须 read,防止覆盖已有的记忆内容。
五、Prompt Caching 命中率优化
这是一个小改动、大收益的案例。
解决:固定前缀在前、时间独立 system 消息、顺序恒定。增量空间:
效果:我以美团的最新LongCat2.0大模型为例,这个截图就展现高命中缓存,总token为20,284,893,缓存命中了18,881,536,命中缓存率大约为93%,加上现在这个大模型付费token包,命中缓存直接免费,可以狠狠的用token了。

- 缓存命中率:基本再88% 到 93%左右
- Token 节省:每轮对话节省约很多token,越聊越省token
群聊场景下收益放大:N 个 Agent 各发一条 system prompt,每个都能命中缓存。
六、性能优化:让 App 更快
GPU 性能优化
之前为了侧边栏的半透明毛玻璃效果,用了 BackdropFilter。但这个 widget 在 Android 上非常吃 GPU,中低端设备滑动帧率直接掉到 40fps 以下。
改成半透明背景色 + 底部模糊层,视觉上接近,GPU 开销小了一个数量级。
Markdown 渲染优化
- 纯文本快速路径:当消息是纯文本时,跳过
MarkdownBody解析,直接渲染 Text widget - 文字流式渐显:消息末尾加 120ms fade-in,打字机效果更自然
- cacheExtent 优化:ListView 预渲染从 4000 降到 2500,减少内存占用
对话加载优化(v1.4.33)
- 快速滚动降级:检测滚动速度 > 阈值 → 纯文本占位,停止 250ms 恢复完整渲染
- 渐进式消息恢复:先出 30 条秒显 → 后台补齐剩余
- 「n 条新消息」浮条:看历史时来新消息,底部显示计数胶囊
架构设计:从单体到插件化
项目经历了三个架构阶段:
v1.0 — 单体架构
ai_service.dart(所有协议混在一起)
chat_controller.dart(所有逻辑混在一起)
tools/(工具散落各处)
v1.3.0 — 分层架构
ai_service_openai.dart
ai_service_anthropic.dart
+ Repository / Service / UseCase 层分离
v1.4.24 — 插件化架构
PluginRegistry(单例编排)
├── CoreTools(核心工具)
├── Skill(技能系统)
└── Mcp(MCP 协议)
新增能力是"加插件"而非"改老代码",符合开闭原则。
v2.0 — 精简回归
砍掉终端模块后,回归纯 Flutter + 必要原生能力(WebView、通知、存储)的架构。代码更干净,维护成本更低。
项目数据
| 指标 | 数据 |
|---|---|
| 提交次数 | 334 次 |
| 标签版本 | 26 个 |
| 测试用例 | 564 个 |
| 语言 | Dart 86.3% / HTML 11.9% / Kotlin 1.8% |
| 协议 | MIT |
关于这个项目
- Gitee:https://gitee.com/deng-6669/personal-agent-app
- GitHub:https://github.com/3d-jq/personal-agent-app
- 官网:https://3d-jq.github.io/personal-agent-app/
- 协议:MIT
- 还有这个项目中我借鉴很多开源项目,有的是借鉴源码,有的是思路-他们的项目地址在:
https://github.com/AAswordman/Operit
https://github.com/OpenMinis/OpenMinis
欢迎大家来给他们和我的点 star
最后说两句
做开源项目最开心的不是 star 数,是有人真的在用。如果你在用 personal-agent-app,或者遇到什么问题,欢迎提 issue,我会认真看,能改的会改的。
如果这篇文章对你有帮助,点个赞/收藏/关注,都是对我持续更新的鼓励。
更多推荐





所有评论(0)