fuzhengwei / fuzhengwei/WaLiAPI

提案|网关会话记忆层(第三块知识资产):捕获流经 WaLiAPI 的对话→蒸馏长期记忆→按需注入,与 KB/Wiki 并列

Open
#47 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
128
Forks
39
Avg merge
15h 25m
Merged PRs (30d)
44

Description

## 一、背景与痛点

WaLiAPI 作为网关,处在每个 Agent 请求的必经之路上——它看得见 Claude Code、Codex、各类客户端的**全部对话**,但今天这些对话只是孤立的请求日志:没有会话维度(`request_logs` 无 conversation_id),同一客户端的连续多轮对话串不成线,legacy `/v1/messages` 路径的响应内容甚至未归一化落库。对话流过即丢,**知识不积累**。

知识库(KB)解决「文档知识」,Wiki 解决「结构化知识」,但会话中持续产生的**经验与偏好**(用户怎么用、什么路径有效、哪些坑反复踩)是第三块知识资产,目前完全流失。社区方向已经验证:mem0(64k+ stars)、TencentDB-Agent-Memory(25k+ stars)、OpenViking 都在做 Agent 记忆,但它们都是独立服务;**WaLiAPI 作为网关天然已经在链路上,捕获会话零接入成本**——这是别的方案需要 Proxy 转发才能获得的位置优势。

与现有能力的关系:记忆层是 Wiki 设计中预留而未实现的 Chat Agent / AgentSession(Phase 4)的地基,也与 kb-upgrade-v2 的「对话历史」互补——KB 记文档,Wiki 记结构,会话记忆记「人与 Agent 协作中产生的经验」。

## 二、总体架构

```text
Agent(Claude Code/Codex/…) ──► WaLiAPI 网关 ──► 上游渠道(OpenAI/Anthropic/…)

┌──────────┴──────────┐
│ ① 会话捕获 │ 挂在既有日志终笔旁,
│ (日志终笔旁挂) │ 重试不计轮次、失败不阻塞
│ ② 会话线程化 │ 显式优先 + 启发式兜底
└──────────┬──────────┘

③ 异步蒸馏(阈值触发:会话满 N 轮或静默 M 分钟)
经管理员可配的「蒸馏渠道」调用 LLM,ADD-only 提取

④ 记忆库(SQLite + FTS5 + HNSW 既有基座,bi-temporal 失效)

⑤ MCP 记忆工具(memory_search / memory_get / memory_list)

Agent 主动检索 ◄──(二期展望:稳定层摘要小预算自动注入)
```

## 三、数据模型(SQL DDL)

### 3.1 会话表(P0,迁移 025)

```sql
CREATE TABLE conversations (
id TEXT PRIMARY KEY,
api_key_id TEXT NOT NULL, -- 第一隔离边界
api_key_name TEXT,
downstream_endpoint TEXT NOT NULL, -- /v1/chat/completions 等
model TEXT NOT NULL,
origin TEXT NOT NULL DEFAULT 'heuristic', -- explicit | heuristic
client_session_id TEXT, -- 显式会话标识
user_scope TEXT, -- 可选 user 子作用域(过滤器字段)
turn_count INTEGER NOT NULL DEFAULT 0,
first_request_at TEXT NOT NULL,
last_request_at TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'active', -- active|closed_timeout|closed_manual
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX idx_conversations_scope
ON conversations(api_key_id, downstream_endpoint, model, last_request_at);

-- request_logs 增列(只增不破坏,历史日志不回填)
ALTER TABLE request_logs ADD COLUMN conversation_id TEXT;
```

### 3.2 记忆表(P2)

```sql
CREATE TABLE memories (
id TEXT PRIMARY KEY,
api_key_id TEXT NOT NULL, -- 与会话同边界
user_scope TEXT, -- 可选二级过滤(mem0 式,不分库)
kind TEXT NOT NULL, -- fact | preference | episode | skill
content TEXT NOT NULL,
entities TEXT, -- JSON 数组:实体链接
embedding BLOB, -- 与 kb_chunks 同模式(BLOB+dim)
embedding_dim INTEGER,
source_conversation_id TEXT, -- 溯源到会话与轮次
source_request_seq INTEGER,
valid_from TEXT NOT NULL, -- bi-temporal:生效时间
valid_to TEXT, -- 失效时间(NULL=当前有效)
status TEXT NOT NULL DEFAULT 'active',
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX idx_memories_scope ON memories(api_key_id, user_scope, status);
```

## 四、关键设计决策

1. **会话归组——显式优先 + 启发式兜底**:`X-WaLi-Session` 头 > 请求体 `user`(chat)/ `metadata.user_id`(messages)字段 > 启发式(api_key + 下游端点 + 模型三元组,距上次请求 30 分钟内续接、否则新开)。归组是纯函数 + 真值表测试;默认参数(窗口、头名)集中定义可调。
2. **记忆提取——ADD-only,不做 LLM 合并**(mem0 2026 新算法先例):只增不改,记忆失效靠 bi-temporal 时间戳(graphiti 思想)而非 UPDATE/DELETE 决策,避免合并误删、实现简单可解释。
3. **触发与成本——阈值异步 + 可配蒸馏渠道**:会话满 N 轮(默认 8)或静默 M 分钟(默认 30)后异步批量蒸馏;蒸馏 LLM 走管理员可配的专用渠道配置(默认复用网关现有选路),额度与模型可控可审计;embedding 链路不可用时降级为 BM25-only 检索兜底。
4. **作用域——api_key 主边界 + 可选 user 子作用域**:api_key 硬隔离;user 存在时作为过滤器字段(不分库),与归组规则天然衔接。
5. **暴露——MCP 按需拉取先行**:先交付 `memory_search / memory_get / memory_list` 工具(TencentDB 按需调用先例),Agent 主动检索,零请求路径风险;**自动注入列为二期展望**(稳定层摘要小预算尾部追加、可开关可审计)。
6. **鉴权前置**:当前 `/mcp`、`/api/kb`、`/api/wiki` 尚无鉴权(api_key 体系只覆盖 `/v1/*`)——记忆经 MCP 暴露前必须补上。可先出独立小 PR 修复,或并入 P3,请维护者定夺。
7. **安全与留存**:记忆内容复用既有 request_body 脱敏管道;retention 默认 90 天可配。

## 五、分期方案(按工程能力增量切分,每期一个可独立合入的 PR)

分期依据只有两条:**依赖顺序**(每期建立在前一期交付之上)与**可独立合入性**(每期自成完整价值、互不阻塞主线)。

| 分期 | 主题 | 交付物 | 依赖 | 尺寸 |
|---|---|---|---|---|
| P0 | 会话数据模型与捕获 | conversations 表、request_logs.conversation_id、归组纯函数+真值表、legacy messages 响应归一化、重试去重 | 无 | 小(**规格与测试设计已备好,可立即出 PR**) |
| P1 | 记忆提取管道 | 阈值触发、蒸馏渠道配置项、ADD-only 提取、BM25-only 降级链 | P0 | 中 |
| P2 | 记忆存储与混合检索 | memories 表、bi-temporal 失效、接入既有 hybrid_search(向量+FTS5) | P1 | 中 |
| P3 | MCP 记忆工具与鉴权前置 | memory_* 工具、`/mcp` 与 `/api/*` 鉴权 | P2 | 中 |
| P4 | 前端面板与可观测 | 记忆库可浏览、检索/注入审计、会话列表页 | P3 | 中 |

二期展望:自动注入双轨(稳定层摘要注入 + 事实层按需)、历史日志会话回填、多租户体系。

## 六、协同与开放问题

- **与现有路线的关系**:记忆层是 kb-upgrade-v2「对话历史」与 Wiki Phase 4 Chat Agent(AgentSession)的地基,不重复、不推翻任何现有模块;KB/Wiki/MCP 全部复用。
- **开放问题(请拍板)**:1) 30 分钟窗口 / `X-WaLi-Session` 头名等默认值是否合适;2) 鉴权修复先出独立 PR 还是并入 P3;3) 蒸馏渠道默认策略(复用选路 vs 强制显式配置);4) memories 与 kb 的 embedding 模型配置是共用还是独立配置。
- **许可声明**:仅借鉴设计思想——mem0(Apache-2.0)、TencentDB-Agent-Memory(MIT)、OpenViking(AGPLv3,**零代码引用**);所有实现为原创 Rust 代码,落库 WaLiAPI 既有 SQLite+FTS5+HNSW 基座。
- 我可以先从 **P0** 开始出 PR(完整规格、测试用例与迁移脚本已备好),您审阅方向后即可动手。

Contributor guide

No contributing guide indexed for this repository

Research direction

For the P0 scope, start by reviewing the existing request-logging path and legacy /v1/messages response handling, then read the proposed migration 025 and session-grouping truth-table tests. Done means conversations are captured with request_logs.conversation_id, retries do not add turns, legacy responses are normalized, and the specified tests pass.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust, sqlite, tauri
Domain
api, authentication, backend, database, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.