📚 离职知识库

接棒知识交接方案(合并两份)

本篇合并 OpenFDE Demo 接棒方案与 Agent 交接方案两份文档。服务器家目录路径已泛化为 /。


#一、OpenFDE Demo 接棒方案

#接棒(Baton)· 开源项目方案

2026-07-30 · 讨论稿 v2(v1 把它当成"演示 Demo"写了,这版按你说的改成开源项目) 还没动手写任何代码,tky 上也一行没改。


#0. 定位纠正(v1 → v2 最大的改动)

它是一个开源项目,不是一场演示。 演示是副产品——项目做出来了,顺手录个五幕演示当宣传素材,但产品本体要能被别人 fork 下来真用,而不是只够在台上跑一遍。

这条改动往下推,有三个连带结果:

v1(演示思路) v2(开源项目思路)
数据存哪 每人一个 SQLite 文件,跑在 tky Supabase Postgres(因为要上 Vercel,Serverless 没法存 SQLite 文件)
后端在哪 tky 上一个 Python 服务 Next.js API Routes,跟前端一起上 Vercel
Hermes 的地位 核心,没它就没东西可演 可选的增强层。主体不装 Hermes 也能完整跑;接上 Hermes 才有"常驻 agent + 飞书私聊 + 定时任务"
数据隔离怎么讲 物理隔离(现场 ls 给人看) Postgres employee_id + RLS,README 里讲清边界
成功标准 5 分钟不出丑 别人 fork → 建个 Supabase → 填 3 个环境变量 → 部署到 Vercel → 能用

"Hermes 变成可选"这一条是关键。如果核心功能非得先在 VPS 上装 Hermes,这个项目的采纳门槛就高到没人会试。改成可选之后:Vercel 那一份是所有人都能跑的完整产品,tky 上那一份是"接了 Agent 层"的参考实现。


#1. 项目做什么

给小微企业(<10 人)每个员工一个私有知识 Agent:员工把自己手上的材料喂给它,日常问它;离职/换岗时把记忆按范围勾选、经接收方确认后移交给接手人,全程留审计日志。

一句话卖点

已有产品把知识当成一个有权限的池子;接棒把知识当成一份有主人、可以被移交的资产

为什么这题没人做过

  • 企微 / 钉钉离职继承 —— 交接的是所有权与在途流程(客户归属、群主、审批单换手)。没有任何一步在做提炼,接手人还得自己去 180 天聊天记录里考古。
  • Glean / Onyx / Dust —— 架构上镜像源系统的 ACL。员工账号一停用,他的私聊和个人盘就从索引里消失。离职恰恰是这类架构最先失效的时刻——这是结构性的,不是"他们忘了做"。
  • 飞书知识问答 / 腾讯 ima / 扣子 / Dify —— 全是「共享知识库」范式:知识一开始就在公共空间、靠权限管谁能看。它不承认"知识先长在个人身上",而小微企业的真实状态恰恰是知识 100% 长在个人身上、从没进过公共空间。
  • Mem0 / Zep / Letta —— 记忆基础设施,不是交接产品。只有 Letta 有原生交接原语(共享 memory block、.af export/import)。

三条产品主张

  1. 交接是一个动作,不是一次权限变更 —— 有触发时点、范围勾选、接收方确认、回执、审计日志。
  2. 交接的是提炼后的判断,不是原始记录 —— 不给 180 天聊天记录,给"这家客户报价底线 92 折,前任口头承诺过年底免运费(出处:报价单 v3 第 2 页)"。
  3. 知识先归个人,再显式移交 —— 符合销售不愿一开始全公开的真实心理。

⛔ 一个刻意的"不做":不做全量克隆。Letta 的 .af 含完整消息历史,把前任所有对话原样倒过去既是产品错误(噪音淹没),也是合规风险(前任私聊、别的客户信息一起过去)。全量导出只用在「离职封存」。这句"我们刻意不做全量复制"本身就是项目最有说服力的一点。

可引用的硬数据(只用这两个)

  • 42% 的机构知识"只存在于某一个人身上" —— Panopto Workplace Knowledge Report(同报告:每周浪费 5.3 小时等信息;<1000 人企业年损约 240 万美元生产力)。
  • 替换一名员工的成本 = 年薪 0.5–2 倍 —— Gallup。

⛔ 中文侧没有可靠一手数据,网上"离职成本 1.5–2 倍""流动率 50%"追不到原始报告,别引。


#2. 架构

┌─────────────────────────── Vercel(前后端一体,这是项目主体)────────────────────────┐
│  Next.js 16 + React 19 + Tailwind 4 + shadcn/ui                                  │
│                                                                                   │
│  页面        总览 / 我的知识库 / 记忆条目 / 交接 / 审计日志                          │
│  API Routes  /api/ingest  /api/search  /api/memory  /api/handoff  /api/ask        │
│  文件        Vercel Blob(原始文件)                                               │
│  数据        Supabase Postgres(Leo-hub):documents / chunks / memory_items      │
│              / handoffs / handoff_items / audit_log,靠 employee_id + RLS 隔离     │
│  问答        任意 OpenAI 兼容端点(默认阶跃,可换云雾/DeepSeek/自建 llm-relay)      │
└───────────────────────────────────┬───────────────────────────────────────────────┘
                                    │  可选(不接也能完整用)
                                    │  HTTPS + Bearer token
┌───────────────────────────────────▼─── tky(Agent 层,参考实现)──────────────────┐
│  baton-agentd(瘦服务,绑 127.0.0.1,nginx 反代 baton-api.saveme505.help)         │
│    ├─ 每员工一个队列(不同人并行 / 同一人串行)                                     │
│    └─ hermes -p emp_wang -z "<问题>" --cli --yolo --resume "baton_wang"           │
│                                                                                   │
│  <HOME>/.hermes/profiles/emp_wang/     ← 一人一个完全独立的家目录                    │
│    ├─ memories/MEMORY.md   (⚠️ 注入上限 2200 字符,只放人设和指针)                │
│    ├─ skills/baton-kb/     反向 HTTP 调 Vercel 的 /api/search 拿知识                │
│    └─ SOUL.md              ⭐ 铁律:业务问题必须先检索,禁止凭记忆编造               │
│                                                                                   │
│  飞书(新建的专用应用)→ lark-cli 长连接 → 分发到对应员工的 profile                  │
└───────────────────────────────────────────────────────────────────────────────────┘

#关键技术决策,以及为什么

① 前后端都在 Vercel,走你原来那一套部署 Next.js API Routes 当后端,不另起服务。部署流程完全照旧:改本地 → git commit(LeoLee0812 / Leo,中文注释)→ push 到 main → Vercel Git 集成自动部署,⛔ 不手动 vercel deploy。域名挂 baton.saveme505.help。部署完回 ~/personal/projects-hub/src/lib/projects-meta.tsx 补一条 PROJECT_META({ icon, description, tint, group: "backend" }),否则会以灰色地球落进"其他"。 ⚠️ Vercel 环境变量的坑:标为 sensitive 的变量写进去后 CLI/后台/API 三条路都读不回明文。跑任何 vercel 写类命令前先 cp .env.local .env.local.bak(media-studio 就是这么丢过四个孤本值)。

② 检索用 pgvector + pg_trgm,⛔ 不用 Postgres 原生全文检索 Postgres 的 to_tsvector 不会切中文(没装 zhparser 的话,一整句会被当成一个词),这是个必踩的坑。所以:

  • 语义检索pgvector(embedding 用云雾的 text-embedding-3-small,1536 维,你已经在 raphael_lore_build.py 里跑通过这条链路)
  • 精确匹配pg_trgm(客户名"宏远建材"、合同号这种,trigram 对中文子串匹配很好用,且 Supabase 一定有这个扩展)
  • 两路结果用 RRF 融合 这比 v1 的 SQLite FTS5 方案多写一点代码,但换来的是"能上 Vercel"和"别人一键部署"。

③ 双层存储 —— 交接的是记忆层,不是知识层 这个拆分同时解决了"到底交接什么"这个最难的问题:

存什么 存哪 怎么交接
知识层 报价单、合同、开户材料、往来摘要 documents + chunks(Blob 存原文件) 交勾选范围内的原始文件 + 出处清单
记忆层 客户约定、报价底线、供应商渠道、人际雷区 memory_items(每人几十条,人可读可编辑) 交接的主体,逐条勾选
注入层 人设 + "你继承了王销售的客户约定,回答会带来源标注" Hermes profile 的 MEMORY.md(⚠️ 2200 上限) 交接时补一段

④ 隔离:employee_id + RLS,并在 README 里讲清边界 v1 用"每人一个 SQLite 文件"是为了演示时能 ls 给人看;上了 Postgres 就没这个便利了,所以改成每个查询强制带 employee_id 过滤 + Supabase RLS 兜底。⚠️ 这条要在代码里做成单一入口(所有查询过一个 scopedQuery(employeeId)),漏一处就是跨人泄漏——README 的安全章节要明写这个风险点和我们的做法。

⑤ Hermes 是可选层 不接 Hermes:网页里问答走普通 LLM 调用(/api/ask 拿检索结果拼 prompt),功能完整。 接上 Hermes:多出「每人一个常驻 agent 人格」「飞书私聊直接问」「定时任务(每晚扫新文件、每周生成一份"你这周新增了哪些约定")」「skill 生态」。README 分成两节:Quick start(纯 Vercel)Agent 层(可选,需要一台 VPS)

⑥ 飞书必须新建一个专用应用 不能复用现有那个(详见第 4 节)。走长连接(无需公网 IP/域名/验签)。 ⚠️ 已知限制:群里交互卡片的按钮回调只能走 Webhook,长连接收不到(私聊是否同样受限未验证)→ 勾选和确认一律做在网页上,飞书只负责问答和送达通知。交接报告也不手拼飞书文档 block(几十个 block + QPS 限制),发富文本消息 + 一个指向网页报告的链接。


#3. 仓库结构

仓库LeoLee0812/baton(中文名「接棒」)。⭐ 建仓时立刻填 description + topicsfde / forward-deployed-engineer / knowledge-handover / agent-memory / hermes-agent / nextjs / supabase)。ChatDemo 那次就是 description 和 topics 全空,GitHub 上搜 ChatDemo 前 15 条全是仿微信聊天 demo,等于把唯一入口废了。

baton/
├── README.md                     中文。定位 / 一键部署 / 架构图 / 安全边界 / Agent 层可选说明
├── supabase/migrations/          建表 SQL(含 pgvector + pg_trgm + RLS policy)
├── src/
│   ├── app/
│   │   ├── page.tsx                    总览:员工卡片(文件数 / 记忆条目数 / 最后活跃)
│   │   ├── kb/[employee]/page.tsx      我的知识库:拖文件、解析进度、chunk 列表带出处
│   │   ├── memory/[employee]/page.tsx  记忆条目:按类型分组、可编辑(交接的标的物)
│   │   ├── handoff/page.tsx            交接:选人 → 勾范围 → bundle 预览 → 发起 → 等确认
│   │   ├── audit/page.tsx              审计日志:谁/何时/哪些项/交给谁/何时确认/未交接项封存
│   │   └── api/{ingest,search,ask,memory,handoff,audit}/route.ts
│   ├── lib/
│   │   ├── db.ts               Supabase 客户端 + ⭐ scopedQuery(employeeId) 单一入口
│   │   ├── parse.ts            文件 → markdown(PDF/Word/Excel/PPT)
│   │   ├── chunk.ts            按标题切 + 800~1000 token 滑窗,每片记 {file, page}
│   │   ├── embed.ts            云雾 text-embedding-3-small(key 只读 env,⛔ 不留明文 fallback)
│   │   ├── retrieve.ts         pgvector + pg_trgm 双路 + RRF 融合
│   │   ├── extract.ts          文档 → 记忆条目(LLM 抽取,带出处)
│   │   └── handoff.ts          bundle 生成 / 写入接收方 / 封存 / 审计
│   └── components/             shadcn/ui
├── agent/                       ⭐ 可选 Agent 层(部署到 VPS,不上 Vercel)
│   ├── agentd.py                瘦服务:每员工队列 → hermes -p
│   ├── feishu_bridge.py         lark-cli 长连接 → 按 open_id 分发
│   └── profile-template/
│       ├── SOUL.md              ⭐ 检索铁律
│       └── skills/baton-kb/     反向调 Vercel /api/search
├── seed/                        虚构演示数据(3 个员工)
└── docs/
    ├── 架构.md
    ├── 部署.md                  Vercel + Supabase + 可选 VPS
    └── 演示脚本.md               五幕(宣传素材用,不是产品的一部分)

#4. ⭐ tky 上的 Hermes:拉斐尔清理 + 干净重装

你要的是:拉斐尔整个不要了,Hermes 删掉重装,大脑还是阶跃星辰 下面是我盘出来的真实影响面——有几件事会连带死掉,需要你先点头。

#4.1 现状(刚查的)

  • Hermes v0.18.2,pip 装在 /usr/local/lib/hermes-agent,家目录 <HOME>/.hermes406 MB),有 1 个本地 carried commit 没上游
  • hermes-gateway.service 在跑,已连两个平台:LINE = connectedTelegram = connected
  • feishu-bot.service 在跑(BOT_BACKEND=hermes,即飞书拉斐尔)
  • <HOME>/.hermes/.env = 543 行 / 28 KB(比记忆里写的"2.6 万行"小得多),里面是一大批孤本 keySTEPFUN_API_KEY DEEPSEEK_API_KEY FIRECRAWL_API_KEY RESEND_KEY TAVILY_API_KEY TELEGRAM_BOT_TOKEN LINE_CHANNEL_ACCESS_TOKEN SLACK_BOT_TOKEN VERCEL_TOKEN SUPABASE_* FAL_KEY ELEVENLABS_API_KEY BROWSERBASE_*
  • <HOME>/.hermes/profiles/ 还不存在(从没建过命名 profile)

#4.2 删了会死什么

❌ 会死(需要你确认可以死)

会死的东西 说明
飞书拉斐尔feishu-bot.service 你在飞书私聊问它、让它操作服务器的那个运维 agent
Telegram @Raphael_tky_bot
LINE bot ⚠️ 这个要特别确认——按我的记忆它连着情侣站那套(project_line_couple_bot)。它现在是 connected 状态
chat-history skill(跨会话检索)
raphael-lore 63 条世界观知识库 你花了两轮、派了 3 个并行 fork 建的那个
state.db 里全部会话历史 / kanban.db

✅ 不会死(我核实过)

  • 每早 09:00 的飞书日报播报daily_feishu.py)—— 它直连 DeepSeek + 飞书 raw API,不走 hermes
  • 英语日报(daily_english_feishu.py)、A 股推荐(daily_stock_recommend.py)—— 同上,不走 hermes
  • 自建 Firecrawl、llm-relay(new-api)、scribe-api、ollama、XFCE 桌面、Cockpit —— 都是独立服务

⚠️ 会连带弄坏一个(容易漏) ashare-auto-git.serviceEnvironmentFile=-<HOME>/.hermes/.env.env 之前必须先把它需要的变量搬到一个独立的 env 文件,否则这个服务静默取空值。 (另外顺手一句:vncserver.service 现在是 failed 状态,跟本次无关,但你要用 /tky 桌面的话得先修。)

#4.3 我建议的执行顺序

第 0 步  全量备份(在动手之前,且备份要落两处)
  tar -czf <HOME>/hermes-backup-20260730.tar.gz <HOME>/.hermes <HOME>/night-run
  再 scp 回 Mac 本地一份 → ~/Desktop/沉淀/tky-hermes-备份-20260730.tar.gz
  ⭐ 单独把 .env 抽出来存成 ~/Desktop/配置信息/tky-hermes-env-备份-20260730.md
     (里面是几十把孤本 key,这一步是整个方案里最不能省的一步)

第 1 步  先把 ashare-auto-git 的 env 依赖搬走
  把它实际需要的变量抽到 <HOME>/ashare/.env,改 unit 的 EnvironmentFile 指向新文件

第 2 步  停服务(先 stop 观察一天,再 disable,别一步到位)
  systemctl stop feishu-bot hermes-gateway
  systemctl disable feishu-bot hermes-gateway

第 3 步  卸载 + 清空
  pip uninstall(或直接删 /usr/local/lib/hermes-agent)
  mv <HOME>/.hermes <HOME>/.hermes.old-20260730     ← ⭐ 用 mv 不用 rm,留一周再删

第 4 步  重装最新版
  curl -fsSL https://hermes-agent.nousresearch.com/install.sh | sh
  (现在线上应该已经比 v0.18.2 新了;那 1 个 carried commit 一并丢掉,正好干净)

第 5 步  只配阶跃,不接任何消息平台
  config.yaml:  provider: stepfun / default: step-router-v1 / context 256K
  .env:         只放 STEPFUN_API_KEY + STEPFUN_BASE_URL=https://api.stepfun.com/step_plan/v1
  ⛔ 不写 TELEGRAM / LINE / SLACK / WHATSAPP 任何 token —— 从零开始,要哪个再加哪个
  ⚠️ 验证 key 时别用 `set -a; . .env` 整体 source(会静默取空,然后被误诊成 401 key 失效),
     用 python 正则单独抽那一行

第 6 步  建 3 个 profile(接棒的员工 agent)
  hermes profile create emp_wang --clone --description "华东区销售,家居建材,负责宏远建材"
  hermes profile create emp_li   --clone --description "华东区销售,接手王销售的客户"
  hermes profile create emp_zhao --clone --description "采购,与销售客户无关"
  验证:hermes -p emp_wang -z "你是谁" --cli --yolo   → 有回应、不串台
       ls <HOME>/.hermes/profiles/                     → 三个独立家目录

为什么建议 mv 而不是 rm:406 MB 而已,机器有 335 G 空闲。留一周,万一发现某个 skill 或某段历史还想要,还能捞回来。一周后没想起来再删。


#5. ⭐ 已经预知的最大一个技术坑

你在 raphael-lore 上踩过并解决过:即使强制预加载 skill,模型依然不去执行检索脚本,而是凭训练记忆自信编造了完全不存在的内容(连人名都编得很像)。解法是把触发写成 SOUL.md 里"铁律"同级的强制条款。

接棒的 SOUL.md 必须写死:

涉及任何客户、报价、合同、供应商、交接的问题,必须先执行 baton-kb 检索,回答必须带出处(文件名 + 页码)。绝对禁止凭记忆编造;检索不到就明确说"我的资料里没有"。涉及交接来的内容,必须标注"来源:<前任> 交接,<日期>"。

这条既是工程必需,也是 writeup 里最好的一个"现场手记"点——这正是 OpenFDE 的核心受众(想转型 FDE 的工程师)想看的东西


#6. 演示脚本(降级成宣传素材,不再是产品目标)

背景公司「合力供应链」8 人,家居建材代理的私域销售。3 个员工:王销售(离职)、李销售(接手)、赵采购(无关第三人)。

演什么
0 立论 "42% 的机构知识只存在于某一个人身上"
1 拖文件入库 拖 3 份文件,实时刷"解析中 → 已入库 12 片"
2 提问 "宏远建材上次报价多少?为什么给到这个折扣?" → 答案 + 可点开核对的出处
3 一键交接 勾选:客户约定 ✅ / 供应商渠道 ✅ / 个人私聊内容 ❌ → 接收方确认
4 接收方答得出 用第 2 幕的原句再问一次 → 答得出,标"来源:王销售交接"
4.5 隔离反证 赵采购的 Agent 同一个问题 → "我的资料里没有" ⭐ 这一幕比任何成功案例都更能建立信任
5 审计 + 封存 审计表一屏;未交接项已随账号封存

⛔ 三件别做:① 别接真实微信/企微数据(授权和会话存档资质解释成本极高)② 别宣称"完整继承聊天记录"③ 别把全量克隆当卖点。 合规:演示数据 100% 虚构,README 首屏明说。你已有的微信解密导出能力一律不进这个项目(沿用隐私铁律:真实记录只留本地、绝不部署)。


#7. 阶段

阶段 做什么 验收
P0 tky:备份 → 清理拉斐尔 → 重装 Hermes → 配阶跃 → 建 3 个 profile hermes -p emp_wang -z "你是谁" 有回应;ls profiles/ 三个目录
P1 Supabase 建表(pgvector + pg_trgm + RLS)+ Next 项目骨架 + shadcn 本地 pnpm dev 起得来,能连上 Supabase
P2 入库链路:上传 → 解析 → 切片 → embedding → 入库;检索 API 传一份 PDF,/api/search 返回 chunk 且带文件名 + 页码
P3 记忆条目抽取 + 编辑页 从文档抽出"客户约定/报价底线"等条目,每条带出处,可在页面上改
P4 交接 + 审计 勾一半条目交接 → 确认 → 李销售那边答得出且标来源 → 未勾选项在李销售那边查不到 → 审计表完整一行
P5 上线:Vercel 部署 + baton.saveme505.help + projects-hub 补 META 线上能跑完 P2–P4 全链路
P6 可选 Agent 层:agentd + baton-kb skill + SOUL 铁律 hermes -p emp_wang -z "宏远建材报价" 答案带真实出处;emp_zhao 同问答"资料里没有"
P7 飞书(需要你先建应用)+ 每员工队列 三人分别私聊各答各的;同一人连发两条不串上下文
P8 README / 虚构种子数据 / 五幕录屏 / 小红书图 + writeup 干净环境按 README 能部署成功

P1–P5 是产品本体(不装 Hermes 也完整可用),P0/P6/P7 是 Agent 层,P8 是引流。


#8. 要你拍板的几件事

  1. LINE bot 能不能一起死? 它现在 connected,按我的记忆连着情侣站那套。删 Hermes 就一起断。要留的话得先记下它的配置,重装后单独把 LINE 通道接回来。
  2. 飞书拉斐尔 / Telegram 拉斐尔确认都不要了? 我按"不要"来做,但删掉后你在飞书就没那个能操作服务器的运维 agent 了(每早的日报播报不受影响,那个不走 hermes)。
  3. raphael-lore 那 63 条世界观知识库要不要单独存一份再删? 你花了两轮建的。我默认整包备份进 tar,但不单独留。
  4. 名字baton(接棒)?还是走 ChatDemo 的命名法叫别的?
  5. 前端风格:拿 ~/Desktop/沉淀/FDE/zhixingyuan 那套(Next 16 + shadcn + GSAP,深色)改,还是重新起一套视觉?
  6. 范围:先做完 P1–P5(Vercel 上完整可用的产品)再回头做 Agent 层,还是 P0 先把 tky 收拾干净?我建议先 P1–P5——tky 那边是破坏性操作,等产品本体跑起来了再动,风险最小。

#附:这轮我做了什么 / 没做什么

  • 没做:tky 上一行没改(没停服务、没删东西、没建 profile);没写代码;没建仓库。
  • 做了:只读盘查了 tky 上 hermes 的依赖面(grep systemd unit、crontab -lgateway_state.json.env 的变量名清单——没打印任何 key 的值)。
  • 顺带两个发现:vncserver.service 现在是 failed/tky 桌面用不了,跟本次无关);.env 实际是 543 行 / 28 KB,不是记忆里写的 2.6 万行。
  • 到期提醒:本机 lark-cliuser 身份 refresh token 8 月 3 日过期(今天 7 月 30 日)。Demo 用 bot 身份不受影响,但你别的依赖 user 身份的脚本这几天要跑一次 lark-cli auth login

#二、Agent 交接方案

#接棒 · 方案 v3

2026-07-30。FDE 那套包装全部去掉了。这就是一个开源项目。 还没写任何代码,服务器上一行没改。


#一句话

给小公司每个人配一个 Agent,管住自己手上的资料。同事之间可以互相问对方的 Agent;人走了或者换岗,一键把该给的交出去。


#五个功能

1. 一人一个 Agent 10 个人的公司,一台服务器上开 10 个 Hermes,各自完全独立(自己的记忆、自己的资料、互相看不见)。

2. 后台上传资料,Agent 自动学 后台里每个人有自己的文件夹。文件拖进去,他的 Agent 定时去扫,发现新文件就自己解析、记进自己的记忆里。第一版只做文档材料(报价单、合同、开户材料、客户资料这些),聊天记录先不做

3. 飞书私聊问自己的 Agent 想不起来的事,在飞书直接私信自己的智能体:"那个客户叫什么名字""上次给宏远报了多少钱"。答案会带上出处——是从哪个文件的第几页看到的,能点开核对。

4. 我的 Agent 能去问老王的 Agent 我问我的 Agent,它自己答不出来,就去问老王的 Agent,拿到答案再回给我,并且告诉我"这是从老王的 Agent 那儿问来的"。 老王能设置自己哪些东西允许被同事问到、哪些不行。后台里能看到所有跨人提问的记录。

5. 一键交接 点"交接",选交给谁,勾选要交哪些东西(客户约定 ✅ / 供应商渠道 ✅ / 某些私人内容 ❌),对方确认后,记忆条目 + 动过的原始文件 + 出处一起过去。 交接完飞书发通知,也可以发邮件。后台留一份记录:谁、什么时候、交了哪些、交给谁、对方什么时候确认的。 不光是离职用——平时销售之间同步一批客户信息也走这套。


#后台管理端长什么样(重点)

shadcn/ui,深色为主。左边侧边栏 + 右边内容区,标准后台布局。

#侧边栏

公司名 / 当前身份切换(演示时能一键切成王销售、李销售、赵采购)/ 五个菜单 / 底部主题切换。

#页面 1 · 总览

  • 顶上四个数字卡片:员工数、文件总数、记忆条目总数、本月交接次数
  • 中间是员工卡片墙:每人一张卡,头像 + 名字 + 岗位 + 三个小数字(文件数 / 记忆条目数 / 最近活跃)+ 一个状态点(在职 / 已交接 / 已封存)
  • 卡片点进去就是那个人的知识库
  • 右边一条动态时间线:谁刚上传了文件、谁的 Agent 问了谁、哪笔交接刚被确认

#页面 2 · 我的知识库

  • 上半是拖拽上传区(虚线框,拖进去就开始跑)。上传中的文件带进度条 + 状态文字:"解析中 → 切片 12 片 → 已入库"
  • 下半是文件表格:文件名、类型图标、大小、入库时间、切了几片、状态。点开一行,抽屉里展开这个文件被切成的每一片内容,每片标着"第 X 页"
  • 右上角搜索框,直接搜自己的库,搜出来的结果高亮命中词、下面挂一行"来源:报价单v3.pdf · 第2页",可以点开

#页面 3 · 记忆条目(交接的标的物,这页最重要)

  • 按类型分组的卡片列表,五类:客户约定 / 报价底线 / 供应商渠道 / 人际雷区 / 流程习惯
  • 每张卡:一句话结论 + 底部一行小字"出处:xxx.pdf 第2页"(可点)+ 右上角三个开关
    • 可编辑(点一下就地改,因为 AI 抽出来的东西得人过一遍)
    • 允许同事的 Agent 问到(就是功能 4 的开关)
    • 交接时默认包含
  • 顶部一排筛选 chip + 一个"重新抽取"按钮

#页面 4 · 交接

左右两栏:

  • :从谁交给谁(两个头像选择器,中间一个箭头)+ 交接原因(离职 / 换岗 / 日常同步)
  • :勾选清单。按类型折叠,每组一个全选,每条一个勾。下面还有一块"原始文件"也是勾选的
  • 底部:交接预览(生成一份"接手人会看到什么"的卡片,可以先看再发)+ 发起按钮
  • 发起后进等待确认状态:一个进度条式的三步——已发起 → 对方已查看 → 对方已确认

#页面 5 · 记录

两个 tab:

  • 交接记录:表格,每行是一笔交接,点开看当时勾了哪些、原文是什么。未交接的部分标"已随账号封存"
  • 跨人提问记录:谁的 Agent 在什么时候问了谁的 Agent 什么问题、拿到了什么、依据是哪条

#视觉

深色底、圆角卡片、大量留白。用 shadcn 的 Card / Table / Sheet / Dialog / Badge / Switch / Progress / Tabs / Command(搜索)/ Sonner(提示)。图标用 lucide。 交接那一页是主场,可以做一点动效(勾选时条目飞到右边、确认成功的动画)。


#技术怎么搭

前端 + 后台管理端:Next.js + shadcn/ui,上 Vercel。部署照你原来那套:改本地 → git commit → push 到 main → Vercel 自动部署,挂 saveme505.help 的子域名,部署完去导航站补一条图标和简介。

数据:Supabase(Postgres)。表大概是:员工、文件、切片、记忆条目、交接单、交接明细、跨人提问日志。原始文件存 Vercel Blob。 检索用 向量 + 三元组模糊匹配两路合并(因为 Postgres 自带的全文检索不切中文,客户名、合同号这种得靠模糊匹配才搜得准)。

Agent 层(跑在你的东京服务器上)

  • Hermes 一人一个 profile(hermes -p emp_wang)。Hermes 自带这个功能,一人一个完全独立的家目录,不用自己造。
  • 一个瘦服务在中间转发:飞书消息进来 → 认出是谁 → 派给他的 Agent。同一个人的消息排队处理(Hermes 是有状态会话,并发跑会互相踩上下文,这是踩过的坑)。
  • 飞书用长连接接,不用公网域名、不用配回调、不用验签。
  • ⚠️ 飞书要新建一个专用应用——现在服务器上那个飞书 bot(拉斐尔)正在收同一批消息,共用一个应用会两边抢答。

关于 Hermes 要不要重装:你上次说拉斐尔不要了、整个删掉重装、大脑还用阶跃。这件事我盘过了,有连带影响(Telegram bot、LINE bot 会一起断,.env 里有几十把孤本 key 必须先备份,还有一个 ashare-auto-git 服务在读那个 .env)。详细的清理步骤和影响清单在上一版文档里OpenFDE-Demo-接棒方案-20260730.md 第 4 节),这版不重复。 我的建议是:先把网页那部分做出来能跑,再动服务器。删 Hermes 是不可逆操作,等产品本体跑起来了再动,风险最小。


#"我的 Agent 去问老王的 Agent" 怎么实现

这是你原话里我一开始理解错的地方,单独说清楚:

  1. 我问我的 Agent:「宏远建材这个客户以前谁跟的,报价什么情况」
  2. 我的 Agent 先查自己的库 → 查不到
  3. 它调一个叫 问同事 的工具:问同事(老王, "宏远建材的报价情况")
  4. 中间那个瘦服务把这个问题转给老王的 Agent,但只允许它在"老王勾了允许对外"的范围里作答
  5. 老王的 Agent 回一句话 + 出处,转回给我的 Agent
  6. 我的 Agent 告诉我答案,并注明「以下来自老王的 Agent」
  7. 后台的「跨人提问记录」里落一条

两个要注意的

  • 只允许问一跳。不然我问老王、老王去问老李、老李又回来问我,会无限套娃。
  • 默认是"允许被问但要留痕",不是"随便问"。老王在记忆条目页面上一条一条控制哪些能被问到。要更严就再加一档"每次都要老王点同意"(异步等确认)。

#分几步做

做什么 做完能看到什么
1 后台界面 + 假数据 一个能点的完整后台,五个页面都在,长得好看。数据是假的,但交互全通
2 建库 + 上传解析入库 真的传一份 PDF 进去,真的切片、真的能搜出来、真的带出处
3 记忆条目抽取 + 编辑 从文档里自动抽出"客户约定"这类条目,每条带出处,能在页面上改
4 交接 + 记录 真交接一次:勾一半 → 对方确认 → 接手人那边查得到、没勾的查不到、记录里有完整一行
5 上线 Vercel 部署 + 子域名 + 导航站收录
6 服务器上的 Agent 层 Hermes 一人一个,命令行里能问出带出处的答案;问不相关的人答"我的资料里没有"
7 飞书 三个人分别私聊,各答各的
8 Agent 之间互问 我的 Agent 真的去问老王的 Agent,记录里能看到

我建议从第 1 步开始:先把后台做出来给你看,好不好看当场就知道,不好看改起来也便宜。后面几步都是往这个壳子里填真东西。


#要你定三件事

  1. 名字。现在暂用「接棒」(英文 baton)。你要是有别的想法就说。
  2. 要不要我先把第 1 步做出来——就是那个后台,五个页面,假数据,能点。做完发给你看长什么样,你看着改。
  3. 界面风格:深色科技风,还是浅色干净风?(你手上 zhixingyuan 那个站是深色 + shadcn + 动效,可以直接拿来当底子改)

来源:沉淀/03-项目方案与交接/OpenFDE-Demo-接棒方案-20260730.md;沉淀/03-项目方案与交接/接棒-Agent交接方案-20260730.md(整理于 2026-08-18)