docs: 统一 README,删除冗余文档;refactor: 消除全部 15 个 warning

- 新建 README.md,整合项目架构、命令、配置、数据流
- 删除 6 个冗余/过时 md 文档
- save_summary_to_db 委托 db::models::save_summary,避免 SQL 重复
- #[allow(dead_code)] 标注 serde 反序列化字段和预留 API
- 移除未使用的 re-export (Summarizer, Message, Role, StreamChunk)
- 修复 README 中 manage_memos 风险等级和缺失的 AMAP_KEY 配置
This commit is contained in:
2026-06-03 17:14:01 +08:00
parent b2fe054eaf
commit 69ba8887ff
13 changed files with 267 additions and 1301 deletions
+240
View File
@@ -0,0 +1,240 @@
# iAs — 微信 AI 智能助手
Rust 实现的微信 iLink Bot,支持 DeepSeek AI 自动回复、内置工具调用、审批确认、定时任务和长期记忆。
## 快速开始
```bash
# 1. 配置环境变量(或创建 .env 文件)
export DEEPSEEK_API_KEY="sk-xxx"
export DATABASE_URL="postgresql://..." # PostgreSQL 可选
# 2. 扫码登录微信
ias login
# 3. 启动 AI 自动回复
ias listen --llm
# 4. 后台运行(配合 systemd
ias service
```
## 命令一览
| 命令 | 说明 |
|------|------|
| `ias login` | 扫码登录微信,认证信息存入 PostgreSQL / 本地文件 |
| `ias listen --llm` | 启动长轮询 + AI 自动回复 |
| `ias listen --echo` | 启动长轮询 + 原样回显 |
| `ias listen` | 仅监听,不做回复 |
| `ias send --to <id> --text <msg>` | 手动发送消息 |
| `ias whoami` | 查看登录状态 |
| `ias usage` | Token 用量统计(默认 7 天) |
| `ias service` | 后台服务模式(日志 + systemd) |
| `ias daemon` | 守护进程模式(daemon + worker 分离架构) |
| `ias tool datetime` | 获取当前时间 |
| `ias tool weather <城市>` | 查询天气 |
| `ias tool search <关键词>` | 联网搜索 |
| `ias tool fetch <URL>` | 提取网页正文 |
| `ias tool memos list/add/delete` | 管理备忘录 |
| `ias tool amap poi-search/geocode/route-plan/travel-plan` | 高德地图服务 |
## 配置(环境变量)
| 变量 | 必须 | 说明 |
|------|------|------|
| `DEEPSEEK_API_KEY` | ✅ | DeepSeek API 密钥 |
| `DEEPSEEK_MODEL` | — | 模型名,默认 `deepseek-v4-flash` |
| `DATABASE_URL` | — | PostgreSQL 连接串,无则降级文件存储 |
| `WEIXIN_LLM_SYSTEM_PROMPT` | — | 自定义系统提示词 |
| `TAVILY_API_KEY` | — | Tavily 搜索 API Key |
| `QWEATHER_API_HOST` | — | 和风天气 API 地址 |
| `QWEATHER_JWT_KEY_ID` | — | 和风天气 JWT Key ID |
| `QWEATHER_JWT_PROJECT_ID` | — | 和风天气项目 ID |
| `QWEATHER_JWT_PRIVATE_KEY_FILE` | — | 和风天气 Ed25519 私钥路径 |
| `AMAP_WEBSERVICE_KEY` | — | 高德地图 Web 服务 Key(或 `AMAP_KEY` |
加载顺序:`./.env``~/.ias/.env` → 环境变量
## 架构
```
┌─────────────────────────────────────────────────┐
│ iAs CLI │
│ main.rs → clap 子命令路由 │
├─────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ WeChat │ │ LLM │ │ Tools │ │
│ │ 长轮询 │ │ DeepSeek │ │ 内置工具 │ │
│ │ HTTP API │ │ 流式对话 │ │ 审批管理 │ │
│ └────┬─────┘ └────┬─────┘ └──────┬────────┘ │
│ │ │ │ │
│ ┌────┴──────────────┴───────────────┴────────┐ │
│ │ Context / Memory │ │
│ │ ChatSession · Token Budget · 摘要压缩 │ │
│ │ MemoryStore · 长期记忆 │ │
│ └──────────────────────┬──────────────────────┘ │
│ │ │
│ ┌──────────────────────┴──────────────────────┐ │
│ │ Database (PostgreSQL) │ │
│ │ auth · chat_records · llm_usage │ │
│ │ user_memories · pending_approvals │ │
│ │ session_summaries · scheduled_tasks │ │
│ └─────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────┤
│ Daemon / Worker IPC (可选) │
│ Unix Domain Socket · 帧协议 · 进程隔离 │
└─────────────────────────────────────────────────┘
```
## 核心数据流
```
微信消息到达
→ 保存 inbound chat_records
→ 用户切换:加载历史 + 记忆
→ 构建 LLM 上下文(token budget + 摘要注入)
→ Conversation.chat_with_tools()
├── LLM 流式回复
├── 工具调用 → query_capabilities / call_capability
│ ├── 上下文工具:read_memories / write_memory / read_summaries
│ ├── 内置工具:datetime / weather / search / memos / fetch_page / amap
│ └── High 风险工具 → 审批流程
└── 工具结果注入对话 → LLM 继续
→ 保存 outbound chat_records + LLM usage
→ 微信发送回复
```
## 源码结构
```
src/
├── main.rs CLI 入口 + 命令实现 + 监听循环 + 工具执行器
├── cli.rs clap 子命令定义(login/listen/send/tool 等)
├── logger.rs 日志初始化(终端 + 文件滚动)
├── state.rs 本地文件状态(auth.json / runtime.json,无DB时降级)
├── scheduler.rs 定时任务调度器
├── context/ 上下文管理
│ ├── types.rs ChatSessioncheckpoint/messages/summaries
│ ├── builder.rs Token budget 估算 + 上下文构建 + 摘要触发
│ └── tools.rs MemoryStoreHashMap<user_id, Vec<mem>>
├── db/ 数据库
│ ├── mod.rs Database 连接池 + 迁移
│ └── models.rs CRUDauth/chat/usage/summary
├── llm/ 对话系统
│ ├── types.rs Message / Role / ToolCall / StreamChunk / Usage
│ ├── provider.rs LlmProvider trait + SSE 解析
│ ├── deepseek.rs DeepSeek 流式客户端
│ └── conversation.rs Conversationchat + chat_with_tools 工具循环)
├── tools/ 工具系统
│ ├── types.rs RiskLevel / SkillSpec / SkillResult / ExecutionContext
│ ├── builtin.rs BuiltinRegistry 路由
│ ├── approval.rs ApprovalManager(确认码 + oneshot 通道)
│ └── builtins/ 内置工具实现
│ ├── datetime.rs 日期时间
│ ├── weather.rs 和风天气(JWT + reqwest
│ ├── web_search.rs Tavily 搜索
│ ├── fetch_page.rs 网页抓取
│ ├── memos.rs 备忘录
│ └── amap.rs 高德地图(POI/地理编码/路径/旅游规划)
├── wechat/ 微信通道
│ ├── types.rs iLink API 协议类型
│ └── client.rs HTTP 客户端(login/poll/send/notify
├── daemon.rs 守护进程(持有 WeChat + DBspawn worker
├── worker.rs Worker 进程(无状态 LLM 执行)
└── ipc.rs Unix Domain Socket 帧协议
```
## 工具系统
### LLM 可见工具
| 工具名 | 说明 |
|--------|------|
| `query_capabilities` | 列出所有可用工具及参数说明 |
| `call_capability` | 按名称调用任意工具 |
| `read_memories` | 读取用户长期记忆 |
| `write_memory` | 写入长期记忆 |
| `read_summaries` | 读取历史会话摘要 |
### 内置工具
| 工具 | 风险 | 说明 |
|------|------|------|
| `get_current_datetime` | Low | 获取北京时间 |
| `query_weather` | Low | 和风天气查询 |
| `web_search` | Low | Tavily 联网搜索 |
| `fetch_page` | Low | 网页正文提取 |
| `manage_memos` | Low | 备忘录增删查 |
| `amap_*` | Low | 高德地图系列 |
### 审批流程
High 风险工具需要用户微信确认:
```
LLM 调用 High 工具
→ 生成 6 位确认码 → SHA-256 入库
→ 微信发送确认消息(含确认码)
→ 等待用户回复(最多 300s,3 次重试)
→ 匹配成功 → 执行工具 → 返回结果
→ 匹配失败 / 超时 → 返回拒绝信息
```
LLM 不感知确认码和审批过程,只看到最终的执行结果。
## 上下文管理
- **Token Budget**28K tokens,中/英文字符估算
- **Checkpoint**:摘要压缩点,之前的消息已压缩,之后完整保留
- **摘要触发**token 溢出(overflow)或 12h 空闲(timeout
- **长期记忆**LLM 按需通过 `read_memories` / `write_memory` 读写
- **用户隔离**:切换用户时清空 session,按需加载新用户历史
## 数据库表
| 表 | 用途 |
|----|------|
| `app_state` | 认证信息 KV 存储 |
| `chat_records` | 收发消息记录(message_id 去重) |
| `llm_usage` | Token 用量统计(含缓存命中率) |
| `user_memories` | 长期记忆(按 user_id |
| `pending_approvals` | 待审批记录(SHA-256 确认码) |
| `session_summaries` | 会话摘要 |
| `scheduled_tasks` | 定时任务 |
## 部署
### systemd 服务
```bash
sudo cp systemd/ias.service /etc/systemd/system/
# 编辑 .env 文件确保 API Key 等环境变量已配置
sudo systemctl enable --now ias
```
### 天气 API 密钥
将和风天气 Ed25519 密钥对放入 `qweather/` 目录:
```
qweather/
├── ed25519-private.pem
└── ed25519-public.pem
```
## 依赖
| 依赖 | 用途 |
|------|------|
| tokio | 异步运行时 |
| clap | CLI 参数解析 |
| reqwest | HTTP 客户端 |
| sqlx | PostgreSQL 驱动 + 迁移 |
| serde / serde_json | 序列化 |
| chrono | 时间处理 |
| tracing | 结构化日志 |
| async-trait | 异步 trait |
| ed25519-dalek | 天气 API JWT 签名 |
| scraper | 网页正文提取 |
| sha2 / hex / rand | 审批确认码加密 |