Memknow 是一个基于 Feishu(飞书)的长期记忆 AI Agent 平台。每个业务场景对应一个飞书应用和一个独立的 Claude Code workspace。用户在飞书发送消息,框架自动路由至对应的 workspace,Claude 处理后将结果卡片回复至飞书。跨 session 的对话历史和总结自动存储到 SQLite,下次用户输入时自动检索并注入 prompt,实现真正的长期记忆。
⚠️ 前提条件:本项目需要一台已安装并登录 Claude Code 的机器。框架是 Claude Code 的调度器与飞书桥接层,不能替代 Claude Code 本身。
快速开始
前置要求
- Claude Code 已安装并登录
- Go 1.24+
- 飞书企业账号(已创建企业自建应用并开启 WS 模式)
安装并运行
git clone https://github.com/ashwinyue/Memknow.git
cd Memknow
go mod download
go build -o server ./cmd/server
cp config.yaml.template config.yaml
# 编辑 config.yaml,填写飞书凭证和 workspace 路径
./server
后台守护进程运行:
make build
make daemon-install # Linux / macOS 开机自启
make daemon-status
详细部署说明请参阅 docs/quickstart.md。
如果你想先快速理解系统是如何工作的,可直接打开文档首页:
为什么选择 Memknow?
- 长期记忆:跨 session 共享记忆,自动检索历史摘要并注入 prompt,bot 越用越懂你。
- 多应用隔离:同一套代码支撑多个完全隔离的 AI Agent 场景,每个应用拥有独立 workspace 和记忆。
- 零公网部署:通过飞书 WebSocket 长连接接入,无需公网 IP,企业内网直接部署。
- 完整的 Agent 能力:Claude Code 的读写文件、执行命令、调用 API 等能力与飞书完整集成。
- 自然语言调度:定时任务和心跳均可通过自然语言创建和管理,内置调度器直接执行。
特性
核心
- 多应用隔离:每个飞书应用对应独立 workspace,session 按
chat/heartbeat/schedule目录隔离,并发安全。 - 自动上下文注入:每次对话前自动检索已归档 session 的摘要和历史消息,注入 prompt,实现跨 session 连续记忆。
- 智能会话管理:单聊 / 群聊 / 话题群全支持,自动维护 Claude context,
/new开启新会话,空闲超时自动归档并生成摘要。 - 文件锁安全:跨 session 共享记忆通过
flock文件锁保障并发安全。
Agent 能力
- Claude Code 全能力:Read / Edit / Write / Bash / WebFetch 等工具直接可用;workspace 还内置了本地
bin/web-search搜索入口,优先走 Tavily,未配置时自动降级到 DuckDuckGo。 - 附件支持:图片、文件自动下载至 session 目录;纯附件消息智能缓存,等待用户说明意图后合并处理。
- 定时任务:对话式创建 schedule,内置
gocron调度器直接执行,无需手写 YAML。 - 内置心跳:heartbeat 由框架内置调度器管理,按
config.yaml周期触发,自动读取HEARTBEAT.md执行自省任务。 - Skill 按需加载:系统 prompt 只注入紧凑索引,需要时通过
Read读取完整 skill 内容,避免 prompt 膨胀。
管理
- YAML 配置:基于 Viper 的单文件配置,支持多应用、白名单、模型覆盖、工具权限最小化原则。
- 轻量运行时:Go + SQLite WAL,CGO-free,单机零依赖,边缘设备亦可运行。
- 事件记录:结构化记录具体事件(cases),支持按时间检索历史案例。
架构
flowchart TB
subgraph Clients [" 客户端 "]
FEISHU["Feishu / 飞书"]
end
FEISHU -->|WebSocket| Router
subgraph Server [" Memknow 服务端 · Go "]
Router["消息路由器"]
Manager["Session Manager"]
Worker["Session Worker<br/>按 channel_key 串行队列"]
Retriever["Context Layer<br/>历史摘要检索注入"]
Executor["Claude Executor"]
Router --> Manager --> Worker --> Retriever --> Executor
end
subgraph Claude [" Claude Code CLI "]
CLI["claude --resume<br/>stream-json 输出"]
end
subgraph Storage [" 本地存储 · SQLite / 文件系统 "]
DB[("SQLite WAL<br/>session / message / task")]
WS["workspaces/<app-id>/<br/>memory / skills / sessions"]
end
Executor -->|spawn| CLI
Server --> DB
Server --> WS
channel_key 格式
| 飞书渠道 | channel_key 格式 | 支持 /new |
|---|---|---|
| 单聊(P2P) | p2p:{chat_id}:{app_id} |
✅ |
| 群聊 | group:{chat_id}:{app_id} |
✅ |
| 话题群 | thread:{chat_id}:{thread_id}:{app_id} |
❌ |
项目结构
Memknow/
├── cmd/server/main.go # 服务入口
├── internal/
│ ├── config/ # YAML 配置
│ ├── model/ # GORM 数据模型
│ ├── db/ # SQLite WAL
│ ├── claude/ # 子进程调用 claude CLI
│ ├── feishu/ # WS 接收 + 卡片发送
│ ├── session/ # Worker 队列 + 记忆检索 + 搜索
│ ├── schedule/ # 内置定时任务调度
│ ├── heartbeat/ # 内置心跳调度
│ ├── cleanup/ # 附件清理
│ └── workspace/ # Workspace 初始化
├── internal/workspace/template/# 默认模板(内嵌到二进制)
├── workspaces/ # 运行时 workspace(.gitignored)
├── docs/ # 文档
├── config.yaml.template # 配置模板
├── Makefile # 常用命令封装
└── go.mod
本地搜索入口
每个 workspace 初始化时都会生成:
bin/web-search:bot 可直接调用的统一搜索命令.search.json:由config.yaml派生出的运行时搜索配置
默认行为:
- 配置了
web_search.tavily_api_key时优先使用 Tavily - 未配置或 Tavily 失败时自动降级到 DuckDuckGo
- 返回统一 JSON,便于 bot 继续读取和处理
开发
go build ./...
go test ./...
go vet ./...
gofmt -w .
更多文档请参阅 docs/ 目录。
No comments yet
Be the first to share your take.