Files
company-kb/docs/08-飞书双向前端方案.md
yangqianqian 84f7950589 Initial commit: company-kb framework
- 完整的知识库框架(P0-P5 路线图)
- 12篇治理文档
- 工具脚本(kb-init.sh, kb-lint-fm.py, feishu-sync.py, kb-bot)
- 7个 Claude 命令
- 示例项目和测试项目(wanniu-l1)
- 契约文件(meta/kb-contract.yaml)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 18:24:39 +08:00

120 lines
7.4 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 08 · 飞书双向前端方案(群机器人 + 呈现)
> 把飞书从「单向导出源」升级为「双向前端」:采集入口 + 查询入口 + 呈现面。
> 状态:方案待批 | 底座已验证lark-cli 已装(bot 身份 cli_a9458d254e3a5bc3),鉴权可用。
## 关键技术验证结论(已实测)
| 能力 | 命令 | 状态 |
|---|---|---|
| 发消息 | `lark-cli im +messages-send --chat-id oc_xxx --markdown "..."` | ✅ bot 可用 |
| 回复(thread) | `lark-cli im +messages-reply` | ✅ |
| **收群消息** | `lark-cli event +subscribe --event-types im.message.receive_v1 --compact` | ✅ **WebSocket 长连接,无需公网回调** |
| 找群 chat_id | `lark-cli im +chat-search --query "群名"` | ✅ |
| 多维表格 | `lark-cli api POST /open-apis/bitable/v1/apps/...`(通用 apiCLI 1.0.3 无 bitable 子命令但通用 api 通鉴权) | ✅ |
| 云文档 | `lark-doc-manager` skill已激活/ `lark-cli docs` | ✅ |
> **最大收获**:能问能答走**长连接**而非公网 HTTP 回调——省掉 VPS 上常驻 web 服务5 人团队负担骤降。
---
## 一、群机器人:能问能答
### 架构(长连接,无公网)
```
同事在飞书群 @机器人 "客户A为什么不用一口价"
↓ 飞书事件 (im.message.receive_v1)
lark-cli event +subscribe ── WebSocket 长连接 ──> 本地/VPS 常驻进程
↓ NDJSON 每行一事件,--compact 提取文本
kb-bot 调度器:解析 → 剥离 @ → 得到问题
调 CC 跑 /kb-ask基于知识库检索强制溯源无据报 Gap
lark-cli im +messages-reply ── 回复到原消息 thread
```
### 落地组件
- `tools/kb-bot/subscribe.sh` — 起长连接:`lark-cli event +subscribe --event-types im.message.receive_v1 --compact --output-dir ./events/`
- `tools/kb-bot/handle.py` — 消费事件:过滤 @机器人 的消息 → 抽问题 → 调 CC headless (`claude -p "/kb-ask <问题>"`) → 取答案 → `lark-cli im +messages-reply`
- 防重event 有 idempotencyhandle 记已处理 message_id。
- 铁律继承:答案强制带 source_link无据回「知识库暂无可 /kb-link 补充」,绝不编造。
### 部署MVP
- 跑在**一台常开机器**(你的 Mac mini / LA VPS 均可,长连接不挑落点)。
- MVP 用 shell + 轮询 events 目录起步;稳定后再包成 launchd/systemd 常驻。
- **不建公网服务、不开端口**——这是刻意的反过度工程。
---
## 二、飞书呈现架构:三层投影
**核心原则:飞书是「读屏」不是「数据库」。** 真相源永远是 Git 仓库,飞书上所有内容都是从 Git **单向投影**的镜像;同事在飞书上看/问,不在飞书上改知识(改走 Obsidian/Git。飞书怎么动都不污染真相源。
三层对应同事三种消费姿势:
```
┌─────────────────────────────────────────────────────┐
│ 第3层 群机器人(问) "客户A为什么不用一口价" │ 找答案·秒回
│ @机器人 → /kb-ask → 带溯源回复(实时,读 Git 真相源) │
├─────────────────────────────────────────────────────┤
│ 第2层 多维表格(查) 全库一张表,按项目/状态筛选/看板 │ 扫全局·俯瞰
│ 每页一行type/status/source/项目/source_link │
├─────────────────────────────────────────────────────┤
│ 第1层 云文档(读) 项目概览、决策来龙去脉 │ 读故事·了解
│ projects/*/_index + 关键 decision → 飞书文档 │
└─────────────────────────────────────────────────────┘
↑ 三层都从同一 Git 仓库单向投影,飞书只读
```
**为什么分三层**:同事需求本就分三种——「了解一个项目」读云文档、「俯瞰筛选全局」用多维表格、「要一个具体答案」问机器人。一层满足不了三种姿势。
**更新节奏(反过度工程)**MVP 第 1/2 层**不做实时同步**——录入后手动跑一次 `feishu-render`,或每天定时同步一次即可;第 3 层机器人是实时的(读 Git 真相源本身,不依赖投影)。
---
### 载体 A云文档第 1 层·叙事型呈现)
- 用途:项目概览、决策来龙去脉——适合「读故事」。
- 同步:`projects/<代号>/_index.md` + 关键 decision 页 → 飞书云文档。
- 工具:`tools/feishu-render.py --docs <代号>`,调 lark-doc-manager / `lark-cli docs +create/+update`
- 频率:按需/手动触发MVP 不做实时)。
### 载体 B多维表格 Bitable第 2 层·结构型呈现)
- 用途:全库总览——每条 decision/doc/conversation 一行,带 `type/status/source/created/项目/source_link` 字段,同事可**筛选/分组/看板/仪表盘**。这是「呈现全库」的主力。
- 同步:扫 `projects/**/*.md` frontmatter → 每页一条记录 → 通用 api 写入 Bitable。
- 工具:`tools/feishu-render.py --bitable`,用 `lark-cli api POST /open-apis/bitable/v1/apps/{app}/tables/{table}/records`
- 字段严格对齐 `meta/kb-contract.yaml`type/status enum 一致)。
- 频率:录入后增量 upsert按 source_link 或页路径做唯一键)。
> Wiki 空间**暂不做**(用户判断现阶段不适合)。
---
## 三、对既有架构的影响(需回改的文档)
1. `docs/04-架构.md` L4 呈现层:飞书从「只读呈现」补充为「双向」——采集(群机器人收/kb-link)、查询(群@问答)、呈现(云文档+Bitable)。**写路径仍唯一(Obsidian/Git)**,机器人问答不写库、只读。
2. `docs/04-架构.md` §4 双前端映射表:飞书行的「写」列注明——群机器人问答是**读**操作(调/kb-ask),不构成第二条写路径。
3. `docs/05-路线图.md`:群机器人 + 呈现属 **P2**(原 P2 只有 feishu-pull现扩为完整双向
4. `docs/07-AI-native工作流.md`:新增「循环 E · 飞书问答」——群 @ → /kb-ask → 回复,人机分工同查询循环。
5. 命令面:无新 /kb 命令(机器人内部调 /kb-ask但新增 `tools/kb-bot/``tools/feishu-render.py`
---
## 四、安全与凭据
- lark-cli 凭据由其自身管理(非本仓环境变量),**不入库**。
- 机器人问答**只读知识库**,不执行写/删——继承「AI 永不擅自有损操作」铁律。
- 群机器人回答带 source_link同事可核。
- 长连接进程日志不含敏感 token--quiet 抑制 stderr
---
## 五、分步实施顺序(建议)
1. **P2-a 发消息打通**`kb-bot` 先做「只发」——手动触发把一条测试答案发到群,验证 chat-id/markdown 渲染。
2. **P2-b 收消息打通**:起 `event +subscribe`@机器人能在 events/ 看到事件。
3. **P2-c 闭环**handle.py 串起「收→/kb-ask→回复」群里问答跑通。
4. **P2-d 呈现-Bitable**:建一张多维表,把 _example 项目的页同步成记录。
5. **P2-e 呈现-云文档**:把 _example 的 _index 同步成飞书文档。
每步独立可验收,任一步卡住不影响已完成步骤。