Skip to content
hur26Public

About

自托管的个人生活 agent:邮箱、日历、手机通知、账单为数据底座,企微负责推送与审批,安卓 App 负责采集与查看

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LifeIn

自托管的个人生活 agent

它读你的邮箱、日历、手机通知和账单,把散落各处的生活信息整理成长期记忆,
通过企业微信推送给你 —— 但凡要动外部世界,先问过你。

Status Python PostgreSQL LLM WeCom Android

产品定义 · 架构设计 · 开发计划 · 技术决策 · 风险登记


它是什么

一个跑在你自己服务器上的程序,加一个装在你手机上的安卓 App。

服务端定时读取邮箱、日历和笔记;App 监听手机上的交易通知与微信群消息 —— 那些东西只存在于手机上,服务端够不着。两边的数据归一成结构化的生活事件流, 提炼成能长期积累的记忆。

看和操作在 App 里(账本、报表、待确认队列);推送和审批走企业微信 (每日摘要、主动提醒、"要不要替你发这条消息"的确认卡片)。 App 不接收任何推送,因此不需要接厂商推送通道。

它不是:通用 agent 框架、给陌生人用的商业产品、又一个聊天机器人。

Note

LifeIn 是工作代号,可随时替换。


架构

flowchart TB
    M["安卓 App(P1)<br/><sub>采集:短信 · 通知监听 | 查看:账本 · 报表 · 待确认<br/><b>不接收推送</b></sub>"]
    A["接入层<br/><sub>企业微信(推送/审批)· 邮件兜底 · Web 控制台(P4)</sub>"]
    B["触发层<br/><sub>定时调度 · 数据源轮询 · 规则扫描 · 用户消息</sub>"]
    C["编排层<br/><sub>按领域分工的 agent 集,同进程 · P3+ 引入状态机</sub>"]
    D["治理层 —— 强制通道<br/><sub>分权网关 · 审批队列 · 审计日志 · 成本核算</sub>"]
    E["能力层<br/><sub>邮箱 · 日历 · 笔记 · 通知 · 账单 · 检索 · 推送</sub>"]
    F["记忆层<br/><sub>事件流 · 实体库 · 事实库 · 向量索引</sub>"]
    G[("PostgreSQL + pgvector")]

    A --> B --> C --> D --> E --> F --> G
    M -.->|采集上报| B
    M -.->|查询 API| D

    style D stroke:#d97706,stroke-width:3px
    style M stroke:#0891b2,stroke-width:2px,stroke-dasharray:4 3
Loading

治理层是强制通道。 能力层的任何工具都不允许被编排层直接调用, 必须经过分权网关。这一条在代码结构上强制,不靠约定。

工具三级分权

等级 含义 示例 网关行为
L1 只读 查邮件、查日历、检索记忆 放行 + 审计
L2 写自己的地盘 建待办、改日历、归类账单 放行 + 审计 + 记录回滚信息
L3 写外部世界 代发消息、提交表单、预约 拦截 → 审批队列

未声明等级的工具默认按 L3 处理,防止新增工具漏标造成越权。


四条核心设计约束

数据整合 > agent 编排

把邮件、日历、账单、笔记归一成统一的生活事件流是脏活,没有技术含量, 但没有它上层全是空的。

长期记忆是唯一护城河

生活助手的价值几乎全部来自"它记得你"。 所有记忆强制携带来源 —— 无法追溯的记忆终将变成噪音。

能动手就必须能刹车

一切写外部世界的操作走审批队列,可回滚,有审计,幂等,超时失效。

每一期都要能真的用起来

不接受"先搭三个月基础设施"。每期都有验收标准和退出条件。


路线图

阶段 主题 验收标准 估计
🔨 P0 邮箱 + 日历 → 每日摘要 你自己每天真的会打开它 2–3 周
⬜ P1 记忆层 + 安卓 App + 主动触发 它开始"记得你",且提醒不烦人 6–8 周
⬜ P2 财务与账单 + App 账本 你不再逐笔记账 6–8 周
⬜ P3 审批执行 你敢让它代发一条真实消息 4–5 周
⬜ P4 多用户托管 + Web 控制台 朋友才在这一步进来 5–7 周

Important

朋友接入推迟到 P4 是硬约束,不是排期偷懒。 一旦有第二个用户,你就成了别人邮箱授权码和支付数据的保管人 —— 这是法律责任而非仅技术责任。P0–P3 期间你需要随时重构、删库、改 schema 的自由。

但多用户的技术预留必须从 P0 第一行代码就做:全表带 user_id、 凭据字段级加密、数据访问不假设单用户。推迟的是开放,不是准备。

详见 开发计划。


技术栈 (P0)

用途 选型
服务端 Python 3.11+ · FastAPI(ADR-016)
客户端 安卓原生 Kotlin,不做 iOS(ADR-015)
调度 APScheduler(进程内,不引入消息队列)
存储 PostgreSQL + pgvector(单库,不引入独立向量库)
模型 外部 LLM API 直调(OpenAI 兼容接口,换 base_url + model 即切换厂商),P0 不套 agent 框架
入口 企业微信(推送 + 审批卡片)· 安卓 App(采集 + 查看,不接收推送)
数据源 邮箱 IMAP + 授权码(QQ / 163)· 企业微信日程 API · 微信通知(P1)· 交易通知(P2)
为什么没有 LangGraph / MCP / hook / 多 agent?

选型标准只有一条:适合项目才用,不为了用而用。 以下技术都经过逐条评估后否决,每条都在 技术决策 里写明了将来重新评估的触发条件。

技术 当前不用的理由 何时重新考虑
LangGraph P0–P2 是"拉数据 → 调 LLM → 推送"的脚本级流程,上框架是纯负担 P3 —— 审批要求流程暂停数小时后从断点恢复,那时 checkpoint / interrupt 才真正划算
MCP 只有一个后端在调工具,包一层 MCP 是白加抽象。工具治理是治理层的事,与 MCP 无关 当你想在其他 MCP client 里也直接查自己的邮件和账单 —— 一套工具两个消费方,MCP 立刻划算
Hook 机制 Hook 是给第三方扩展用的抽象,本项目没有第三方。拦截 L3 就是网关里的一个分支判断 基本不会 —— 与"不做通用框架"的非目标冲突
多 agent 竞争择优 该范式需要客观验收标准且值得 N 倍 token,生活任务两条都不满足 基本不会。注意 agent 按领域分工已经在做(摘要 / 问答 / 记忆 / 日程 / 记账 / 执行,同进程运行),那是模块划分,与竞争择优是两回事
独立向量数据库 当前数据量下纯属增加运维复杂度,跨库事务一致性也难保证 向量数据超百万级且检索延迟成为瓶颈

文档导航

文档 回答什么问题
AGENTS.md 在本仓库写代码的约束 —— 铁律、开工前必须先定的事、否决清单
01 产品定义 给谁用、解决什么、边界在哪、明确不做什么
02 架构设计 系统怎么分层、数据怎么存、记忆和审批怎么工作
03 开发计划 P0–P4 分期,每期的验收标准和退出条件
04 技术决策 每个选型的理由,以及被否决的方案和否决理由
05 风险登记 隐私、合规、提示注入、成本、信任、平台政策
06 数据模型 归一化骨架、完整 DDL、待确认队列 —— 改这里等于改代码
07 配置清单 跑起来到底要准备什么、白名单与验证码过滤

新加入的人建议按 01 → 03 → 04 的顺序读;要动手写代码,先读 AGENTS.md 再读 06。

Warning

04 里记录了大量"为什么不做 X"。三个月后最容易犯的错, 就是把这些当成遗漏而随手加回来。动手改架构前请先读对应条目。


开发约定

  • 一个可独立描述的改动 = 一次提交 = 一次推送,不攒批
  • 提交信息说清为什么这么改,不只是改了什么 —— 三个月后你只会记得 why
  • 引入新依赖或新技术前,先在 04 补一条 ADR, 写明被否决的替代方案和将来重新评估的触发条件
  • 每期结束写复盘,把新学到的和被推翻的结论回写进 04

本项目会接触真实的个人邮件、日历与支付数据。
凭据与数据一律不入仓库,详见 风险登记。

About

自托管的个人生活 agent:邮箱、日历、手机通知、账单为数据底座,企微负责推送与审批,安卓 App 负责采集与查看

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors