PicoButler
我一直在想,Agent 时代,人与软件 / AI 或者说数据的交互形式是什么?
过去我们的答案是 App------想吃饭找外卖,想打车找出行,想记事找备忘录。每件事都要切换软件,找到入口,一步步点进去。这套逻辑在 App 时代是对的,但现在,我觉得它该变了。
Pico 是一个由 OpenClaw 驱动的本地生活私人管家。你不需要打开任何 App,只需要说出你想做的事,剩下的 Pico 来完成。
但 Pico 不只是「更聪明的执行者」。
真正的私人管家,不会只等你开口。
Pico 有长效记忆------它记得你的生活,观察你的习惯,然后在对的时间主动出现:
"你妈妈生日还有三天,上次你说要给她订蛋糕,要我帮你安排吗?"
"你的经期大概今天开始了,早上要不要来一杯红糖银耳羹?"
"明天周一,你这几周这时候都要叫车去健身房,要我提前帮你叫好吗?"
它有传统软件的UI 端------ AI 时代还没有完全到来,我们需要一个过渡;它还有硬件端------通过授权,你的 OpenClaw 可以直接调用 Pico 的一切能力,连屏幕都不需要。
李彦宏说,要用 AI 原生思维把所有产品重做一遍。a16z 说,AI 将会吞噬所有应用软件,AI的时代正在到来。
Pico 是我对这个时代的一次回答。
技术小结
Pico 基于 OpenClaw 开源框架构建,注册了 8 个覆盖本地生活场景的核心 Skill,包括餐饮推荐、下午茶、打车方案、酒店住宿、活动规划、记忆管理等,分为直接执行型与复杂任务编排型两类。 架构上分为外部协议层与内部编排层:外部通过 OpenClaw 的 skill registry、MCP 授权体系与统一执行网关对外暴露能力;内部由聊天编排、tool registry、数据库与记忆服务构成执行链路。OpenClaw 调用的是统一网关,网关再驱动内部的模型与工具编排,而非直接触达底层服务------这意味着 OpenClaw 是在「代用户调用 Pico 的能力」,而不是匿名的公共访问。 软件端基于 Next.js + React + TypeScript 构建,数据层采用 PostgreSQL + Drizzle ORM。OpenClaw 通过 MCP token 体系完成授权,经统一执行网关进入 Pico 内部的聊天编排与工具链,硬件客户端同样通过这套协议接入,OpenClaw -> MCP auth -> gateway -> mcp chat -> 内部 tool registry -> 结果返回,调用软件端的全部能力。
默认站点地址:
text
http://localhost:3000
当前运行方式
- 模型调用走 DeepSeek 直连
- 数据库通过
DATABASE_URL直连 Neon 或 PostgreSQL - Redis 可选
- 当前默认不启用文件上传
技术栈
前端与应用框架
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS 4
- Radix UI / shadcn 风格组件
- Framer Motion / Motion
- SWR
AI 与聊天编排
ai@ai-sdk/react@ai-sdk/deepseek- 自定义聊天编排:
lib/chat/orchestration.ts - Tool 注册与调用:
lib/ai/tool-registry.ts
认证与数据层
next-auth@5 betadrizzle-ormdrizzle-kit- PostgreSQL / Neon
- 可选 Redis
编辑器与富文本
- CodeMirror
- ProseMirror
- Shiki
- KaTeX
- Streamdown / Mermaid
测试与工程化
- Playwright
- Biome
- Ultracite
功能模块
1. 关系式记忆(mem0)
聊天时自动提取用户提到的信息(人物、时间、偏好、禁忌等),跨对话持久存储,在合适时机主动召回。
- 存储:mem0 云端 API
- 写入:每轮对话结束后异步提取,不阻塞响应
- 召回:每次请求前检索相关记忆,注入 system prompt
- 查看/删除:侧边栏「我的记忆」→
/memories
2. 介入程度可调
用户可以为每个生活模块单独设置 AI 的介入深浅。
两档设置:
| 展示名 | 系统 key | 行为 |
|---|---|---|
| 朋友型 | friend |
在合适时机主动提醒、多嘴一句 |
| 任性型 | yolo |
只管干活,绝对不评论、不提醒 |
支持模块:
| key | 展示名 |
|---|---|
food |
饮食 |
transport |
出行 |
hotel |
住宿 |
shopping |
购物 |
exercise |
运动 |
finance |
消费 |
social |
社交 |
- 存储:PostgreSQL
UserModuleSettings - 默认值:全部模块默认为
friend - 设置入口:
/settings
3. 主动提醒与通知节流
项目会结合记忆、邀约回复、服务进度和近期行为,生成主动提醒,并尽量避免打扰用户。
- 主动提醒来源:待处理通知、邀约/回复、近期服务订单、习惯触发
- 展示方式:聊天区插入助手消息 + 浏览器通知
- 节流策略:静默时段、每日预算、去重触发
- 相关数据表:
NotificationBudget、ProactiveTrigger
4. 管家联系人与社交协作
支持维护联系人关系,让管家可以直接帮用户发邀约、查回复、跟进社交安排。
- 联系人入口:
/contacts - 能力覆盖:联系人搜索、发起邀请、查询待处理邀约、处理回复
- 相关数据表:
AgentContact、AgentMessage
5. 服务编排与生活场景执行
聊天不仅能回答问题,还能直接进入生活服务编排流程。
- 支持能力:餐饮推荐、打车方案、酒店搜索、鲜花/蛋糕/礼物下单、餐厅预订
- 编排能力:事件链执行、多平台搜索、协商式方案生成
- 结果沉淀:服务订单统一写入
ServiceOrder - 前端承载:聊天消息流 + 任务侧栏 + 服务面板
6. MCP Token 与外部桥接
项目支持为用户生成 MCP Token,供外部桥接或自动化客户端调用站内能力。
- 设置入口:
/settings页面下方的 MCP Token 管理区 - 核心能力入口:
/api/mcp/chat、/api/mcp/tokens - 用途:外部工具代用户调用聊天、服务编排和部分 agent 能力
7. OpenClaw 外部入口
项目内置 OpenClaw 网关,适合把 PicoButler 当成外部执行层接入。
- 探活:
GET /api/openclaw/health - 机器可读 registry:
GET /api/openclaw/registry - 统一执行入口:
POST /api/openclaw
设计分工:
- OpenClaw:入口层,负责意图识别、skill 粗分发、最小追问、展示结果
- PicoButler:执行层,负责聊天编排、工具调用、服务执行、记忆、通知
- Web App:复杂交互承载层,承接任务面板、设置页、记忆页、联系人页
详细说明见 docs/openclaw-integration.md。
当前 OpenClaw Skills
仓库当前已经注册了 8 个面向 OpenClaw 的 skills,定义在 skills/registry.json:
pico-afternoon-teapico-what-to-eatpico-food-recpico-book-ridepico-hotel-suggestionpico-plan-outingpico-check-servicespico-my-memory
这些 skills 的作用不是替代业务 API,而是告诉 OpenClaw:
- 哪些说法应该命中哪个 skill
- 需要哪些输入参数
- 缺参数时怎么追问
- 结果如何展示
- 何时应 handoff 回 PicoButler Web
接口文档
接口文档仅用于本地开发和调试,当前不会在用户页面中提供入口。启动本地开发环境后,可直接访问:
- 真实业务接口 Swagger:
http://localhost:3000/api/docs - 真实业务接口 OpenAPI JSON:
http://localhost:3000/api/openapi.json - Mock 接口 Swagger:
http://localhost:3000/api/mock/docs - Mock 接口 OpenAPI JSON:
http://localhost:3000/api/mock/openapi.json
本地运行

先安装依赖:
powershell
pnpm install
执行数据库迁移:
powershell
pnpm db:migrate
启动开发环境:
powershell
pnpm dev
常用脚本
powershell
pnpm dev
pnpm build
pnpm start
pnpm check
pnpm fix
pnpm db:migrate
pnpm db:studio
pnpm openclaw:match
pnpm openclaw:export
pnpm test
.env.local 必填项
至少需要以下环境变量:
env
AUTH_SECRET=你的随机密钥
DEEPSEEK_API_KEY=你的DeepSeek密钥
DATABASE_URL=你的Neon或PostgreSQL连接串
.env.local 可选项
如果你需要 Redis,再增加:
env
REDIS_URL=redis://localhost:6379
不配置时的影响:
- 不配
DATABASE_URL:项目会直接启动失败 - 不配
REDIS_URL:项目仍可启动,但会失去 IP 限流和流恢复能力 - 当前文件上传接口未配置存储后端,默认不可用
相关文档



