ACCENT
MODUSENSUS LAB · NO.02

个人 AI 工作台「nest」:对话驱动的个人工作台

像 Notion + ChatGPT 的结合体,但数据完全归你管,可以部署到自己的服务器上,手机也能访问

Aug 10, 2026 20 MIN READ VIEWS
个人 AI 工作台「nest」:对话驱动的个人工作台
COVER · PROJECT / AI / WORKBENCH
CONTENTS

这是什么?

一个由对话驱动的个人工作台——你通过跟 AI 助手聊天,就能管理项目、任务、习惯打卡、写文章,一切数据都保存在你自己手里。

一句话类比: 像 Notion + ChatGPT 的结合体,但数据完全归你管,而且可以部署到自己的服务器上,手机也能访问。


一、整体架构

系统长什么样?

┌──────────┐      ┌───────────┐      ┌──────────────┐
│ 浏览器    │ ←──→ │  FastAPI  │ ←──→ │   AI 模型    │
│ (React)   │ REST │  后端     │ OpenAI│ (DeepSeek等) │
│ localhost │  API │  :8000    │  API  │              │
└──────────┘      └─────┬─────┘      └──────────────┘

                    ┌────▼─────┐
                    │  SQLite   │
                    │  数据库   │
                    │ (本地文件) │
                    └──────────┘

浏览器(前端)→ 后端 → AI 模型,这是最核心的数据流。

前后端分离

这个项目是典型的前后端分离架构:

  • 前端(React):负责界面展示和用户交互。像一个餐厅的菜单和前台——你看到什么、点哪里,都由前端决定。
  • 后端(FastAPI):负责业务逻辑和数据存储。像餐厅的厨房——你点完菜(操作),后端处理(做饭),然后把结果端上来(返回数据)。

前后端通过 REST API 通信——就像你通过菜单点菜,服务员(API)把订单传给厨房,厨房做好后端上来。

数据存在哪?

全部存在你本机的 SQLite 数据库 里,一个文件而已:

backend/data/workbench.db

为什么用 SQLite 而不是 MySQL?

  • 零配置,不需要安装数据库服务
  • 一个文件,备份就是复制粘贴
  • 个人使用,不需要多用户并发
  • 够用就好

类比: 就像用 Excel 文件记账 vs 用金蝶用友——一个人用,Excel 就够了;一百个人同时用,才需要专业数据库。


二、技术栈

技术为什么选它?
前端框架React组件化,生态丰富,适合复杂交互
构建工具Vite比 Webpack 快 10 倍,开发体验好
前端样式纯 CSS(无框架)杂志风格需要精细控制,CSS 框架反而限制
后端框架FastAPI(Python)异步性能好,自动生成 API 文档
数据库SQLite零配置,单文件,适合个人应用
AI 接口OpenAI 兼容协议通用标准,可换任意模型供应商
容器化Docker一键部署,环境一致
桌面打包Electron把网页变成桌面应用
手机打包PWA / Capacitor浏览器添加主屏幕,或 APK 安装

为什么不用 Django?

Django 是大而全的框架,自带管理后台、ORM、用户系统。但我们的需求很简单——几个 API 端点、一个 SQLite 数据库。FastAPI 更轻量,性能更好,写起来也快。

类比: 就像做一顿一人食的晚餐,你不需要一个五星级酒店的后厨团队。一个炒锅就够了。


三、功能模块详解

3.1 主页(HomeView)

报刊名板式的总览页面,灵感来自杂志封面:

┌──────────────────────────────────────┐
│  Vol. 2026 · No. 123  │  8月9日 · 日 │   ← 刊头(Masthead)
├──────────────────────────────────────┤
│  早上好,小明                        │
│  今日打卡 3/5 · 进行中任务 2          │
├────────────────┬─────────────────────┤
│  目标倒计时     │  日历              │
│  考研  █████ 87天│  日 一 二 三 四 五 六│
│  毕业  █████ 200天│        1  2  3  4  5│
│  [名称] [日期]   │  6  7  8  9 10 11 12│
│  [添加]          │  ...                 │
├────────────────┴─────────────────────┤
│  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  │
│  ← 坚持热力图(GitHub 风格)          │
├──────────────────────────────────────┤
│  ┌────────┐  ┌────────┐  ┌────────┐  │
│  │ 今日打卡 │  │ 项目进度│  │ 进行任务│  │   ← 瀑布流卡片
│  │ 健身 ✓  │  │ 网站 80%│  │ 修复bug │  │
│  │ 阅读    │  │ 设计 50%│  │ 写文档  │  │
│  └────────┘  └────────┘  └────────┘  │
└──────────────────────────────────────┘

关键点:

  • 所有数据通过一个 /api/overview 接口一次性获取
  • 倒计时自动计算剩余天数,每小时刷新一次
  • 热力图用 CSS 变量控制颜色,自动跟随明暗主题

3.2 对话(ChatView)

核心功能——跟 AI 助手聊天,它能调用工具帮你做事。

工作流程:

你:「帮我建一个项目,叫"毕业设计"」


发送消息到后端 → 后端转发给 AI 模型


AI 返回:我想调用 create_project 工具


后端执行 create_project("毕业设计")


把结果返回给 AI → AI 组织成自然语言回复


你看到:「已创建项目"毕业设计"」

这就是 Function Calling(函数调用): AI 模型不只是聊天,它能决定「我该调用哪个工具」,然后后端执行,再把结果告诉它。

类比: 就像你请了一个助理。你说「帮我订一张去北京的机票」,助理(AI)会打开订票系统(工具),查好航班,订好票,然后告诉你结果。你不需要自己操作订票系统。

可用的工具:

  • 建项目、建任务、更新任务状态
  • 打卡、查询打卡情况
  • 查询工作台概况(项目/任务/习惯数量)
  • 管理记忆库(提议修改文件)

3.3 项目(ProjectsView)

┌────────────────────┐  ┌────────────────────┐
│ 毕业设计            │  │ 个人网站            │
│ 完成 5/8 个任务      │  │ 完成 3/3 个任务      │
│ ████████████░░ 62%  │  │ ██████████████ 100% │
│ [归档] [删除]        │  │ [归档] [删除]        │
└────────────────────┘  └────────────────────┘

每个项目有名称和描述,下属任务通过 project_id 关联。项目进度条自动计算完成百分比。

3.4 任务看板(TasksView)

三栏看板:待办 → 进行中 → 已完成

┌───────────┬───────────┬───────────┐
│  待办 3   │  进行中 2  │  已完成 5  │
├───────────┼───────────┼───────────┤
│ 写论文    │ 做实验    │ 开题报告  │
│ 查文献    │ 改bug     │ 文献综述  │
│ ────────  │           │           │
│ 设计原型  │           │           │
└───────────┴───────────┴───────────┘

任务可以设截止日期、归属项目。点击「开始 →」或「完成 ✓」让任务流转到下一栏。

3.5 打卡(HabitsView)

习惯管理 + 热力图:

┌────────────────────────────────┐
│  ■■■■■■■■■■■■■■■■■■■■■■■■■  │
│  ■■■■■■■■■■■■■■■■■■■■■■■■■  │   ← 53 周热力图
│  ■■■■■■■■■■■■■■■■■■■■■■■■■  │
│  少 ■■■■■■■■■■■■■■ 多          │
├────────────────────────────────┤
│  ┌──────────────────────┐      │
│  │ 健身 · 连续 15 天     │      │
│  │ 累计 87 天           │      │
│  │ ■■■■■■■■■■■■■■■■■■■■ │      │   ← 单个习惯近 5 周
│  │ [今日打卡]            │      │
│  └──────────────────────┘      │
└────────────────────────────────┘

热力图是 GitHub 风格的贡献图——颜色越深,打卡次数越多。每个格子代表一天,鼠标悬停显示具体日期和次数。

3.6 写作(WritingView)

Markdown 双栏编辑器:

┌──────────────────────────────┐
│ [文章标题] [草稿 ▼] [保存]   │
├────────────────┬─────────────┤
│                │             │
│  # 标题        │  标题       │
│  正文内容...   │  正文内容...│
│  **重点**      │  重点       │
│                │             │
├────────────────┴─────────────┤
│ ☑ 个人博客 [链接]            │
│ ☐ Substack   [链接]          │
│ ☐ Medium     [链接]          │   ← 发布状态跟踪
└──────────────────────────────┘

左栏写 Markdown,右栏实时预览。支持上传配图、导出 .md 文件、跟踪发布状态。

3.7 记忆库(MemoryView)

这个功能比较特殊,值得单独讲。

它分为两部分:

① 记忆文件 — Agent 提议修改,你审批后才能生效

Agent 在对话中说:「我注意到你喜欢晚上工作,建议记录到记忆库」


Agent 调用工具 → 创建一条「提案」(proposal)


你去记忆库页面 → 看到提案 → 点击「批准」或「驳回」


批准后 → 文件写入 backend/memories/ 目录

这就像 Git 的 Pull Request 机制: Agent 只能提 PR(提案),不能直接 push(修改)。你来 review 和 merge。

② 跨聊天记忆 — 在所有对话中自动生效

你在对话 1 中说:「我是城市规划专业的学生」


Agent 自动调用工具 → 保存为 memory_fact


你在对话 2 中问:「帮我查一下城市设计案例」


Agent 的 system prompt 自动注入这条记忆 → 给出更相关的回答

这就像 ChatGPT 的跨聊天记忆: 你跟 AI 聊过一次,它下次还记得你的背景信息,不需要重复说。

3.8 主题切换

日刊 / 夜刊双模式,通过 CSS 变量实现:

:root {
  --bg: #f1eee5;        /* 日刊:冷纸底 */
  --text: #1a1a1a;      /* 墨色 */
  --accent: #9e2b25;    /* 编辑红 */
}
[data-theme="dark"] {
  --bg: #131416;        /* 夜刊:深灰底 */
  --text: #e9e6dd;      /* 米白字 */
  --accent: #d0715e;    /* 暖红 */
}

CSS 变量的好处是:改一个值,所有用到它的地方都跟着变。 不需要手动改每个元素的颜色。


四、部署方案

四种部署方式,覆盖所有场景

┌──────────────────────────────────────────────────┐
│                   你的电脑                         │
│  ┌────────────┐  ┌─────────────────────────────┐ │
│  │ Docker 启动 │  │  Electron 桌面应用 (.exe)    │ │
│  │ 一键脚本    │  │  双击启动,像普通软件一样    │ │
│  └────────────┘  └─────────────────────────────┘ │
└──────────────────────────────────────────────────┘

                        手机访问

         ┌──────────────┴──────────────┐
         ▼                              ▼
  ┌──────────────┐            ┌──────────────────┐
  │  PWA 添加到   │            │  Android APK      │
  │  手机主屏幕   │            │  原生应用体验      │
  └──────────────┘            └──────────────────┘
         ▲                              ▲
         │                              │
  ┌──────────────────────────────────────────┐
  │            云服务器(公网)                │
  │  Docker + Caddy HTTPS 反向代理            │
  │  手机从任何地方都能连                      │
  └──────────────────────────────────────────┘

Docker 是核心

Docker 把整个应用打包成一个「集装箱」——里面装好了 Python、Node.js、所有依赖。无论你在哪台机器上运行,行为完全一致。

类比: 就像麦当劳的标准化厨房——无论在北京还是纽约,用同样的流程、同样的设备,做出来的汉堡味道一样。Docker 保证了「在我电脑上能跑,在你电脑上也能跑」。

Electron 桌面应用

Electron 是一个「浏览器壳」——它把网页包装成一个可以双击打开的桌面应用。

工作原理:

  1. 启动时,Electron 先启动后端的 Python 进程(用 PyInstaller 打包成 .exe)
  2. 然后打开一个浏览器窗口,加载 http://localhost:8000
  3. 用户看到的就是一个完整的桌面应用,不需要额外安装 Python 或 Docker

五、手机端适配

问题

电脑上的三栏布局在手机上完全没法用——侧边栏占半个屏幕,按钮太小点不到。

解决方案

在手机上,布局变成这样:

┌──────────────────────┐
│ ☰           个人AI工作台│  ← 汉堡菜单(点开滑出侧边栏)
├──────────────────────┤
│                      │
│     内容区域           │
│     (全屏宽)         │
│     单栏布局           │
│                      │
├──────────────────────┤
│ 🏠 💬 📁 📋 ✅ ✏️ 💻 📖│  ← 底部导航栏
└──────────────────────┘

三个关键变化:

  1. 侧边栏变成抽屉(点 ☰ 滑出,点遮罩层收回)
  2. 底部导航栏固定(拇指够得到)
  3. 所有多栏布局变成单栏

技术实现用了 CSS 媒体查询 + React 状态检测 的组合拳——CSS 负责外形调整,React 负责交互切换。


六、开发历程

主要里程碑

阶段内容
初始搭建React + FastAPI 骨架,基础 CRUD API
对话功能流式聊天、Function Calling 工具调用
功能完善项目、任务看板、打卡、写作
记忆库Agent 提案审批机制、跨聊天记忆
杂志风格 UICSS 变量主题、日刊/夜刊、刊头、发丝线、编辑红
手机端适配抽屉式菜单、底部导航、单栏布局
桌面打包Electron + PyInstaller 打包为 .exe
手机 APKCapacitor 配置、GitHub Actions 自动构建
云服务器部署Docker Compose、Caddy HTTPS、一键部署脚本
安全加固敏感文件 gitignore、登录保护、CSRF 防护

七、学到什么

1. Function Calling 不是魔法

AI 模型并不真的「理解」你的工具,它只是根据你的工具描述(JSON Schema),选择最匹配的那个。你给它的描述越清晰,它选得越准。

2. CSS 变量 + 响应式 = 维护成本低

用 CSS 变量管理主题色,用媒体查询做响应式,比 JS 方案更简洁、性能更好。

3. 个人应用的数据安全思路

  • 数据永远存在你自己手里(SQLite 文件)
  • API Key 只存在服务端 .env 里
  • 聊天记录不上传任何第三方
  • 部署到公网时必须加 HTTPS 和密码

4. 渐进式增强

先做桌面版,再做手机适配;先用 Docker 部署,再打包成桌面应用;先 PWA,再 APK。每一步都是在前一步的基础上增加的,没有一步到位。


八、项目结构速览

backend/              ← Python 后端(FastAPI)
  app/
    main.py           入口、会话、聊天、Claude 面板
    workbench.py      项目/任务/打卡/倒计时/文章 API
    database.py       数据库建表
    auth.py           登录认证
    agent_tools.py    AI 可调用的工具函数
    mcp_server.py     MCP 协议支持
  data/               数据库、头像、配图(Git 忽略)
  memories/           记忆库文件(Git 忽略)
  .env.example        配置模板

frontend/             ← 前端(React + Vite)
  src/
    App.jsx           主应用、路由、侧边栏
    main.jsx          入口、登录页面
    style.css         全局样式(CSS 变量、主题)
    workbench.css     组件样式、响应式
    views/            每个页面的组件
    components/       热力图、概况栏、图标等
    api.js            跟后端通信的 API 工具
  public/
    photos/           主页卡片刊头照片
    sw.js             离线缓存 Service Worker

electron/             ← 桌面应用打包
  main.js             启动后端 + 打开窗口
  build.bat           一键构建脚本

deploy/               ← 服务器部署
  setup.sh            一键部署脚本
  Caddyfile           HTTPS 反向代理配置

docker-compose.yml    Docker 一键启动
Dockerfile            容器镜像构建

九、下一步可能的方向

v1 已经完成了从「能跑」到「好用」的蜕变,未来可以考虑:

  • 多用户支持:目前是单用户模式
  • 数据导出/导入:备份和迁移更方便
  • 更多 AI 模型接入:如 Claude、Gemini
  • 离线模式:PWA 的 Service Worker 缓存更多资源
  • 文件管理:上传的文件集中管理
  • 国际化:英文界面支持

最后的话: 这个项目的核心理念是——让 AI 帮你做事,而不是替你做事。 你仍然是主人,AI 是你的工具。所有数据归你,所有决策由你拍板。这就是一个「个人工作台」应该有的样子。