docs: design upstream-compatible memory search options

This commit is contained in:
2026-06-15 15:56:29 +08:00
parent 42de7f9da0
commit 8fcf0941c0

View File

@ -0,0 +1,145 @@
# Memory Search 上游参数增量兼容设计
## 目标
扩展 Memory Gateway 的 `POST /memories/search`,在保留现有用户鉴权、
`scope` 搜索编排、资源隔离、软删除和覆盖修改能力的前提下,支持上游
搜索接口的全部请求选项。
本次只修改 `/memories/search`,不新增 `/memories/get`,也不提供上游路径的
线协议兼容接口。
## 请求模型
保留现有字段:
- `user_id`:必填,始终用于 Gateway 用户鉴权和本地数据隔离。
- `user_key`:必填,用于 Gateway 用户鉴权。
- `conversation_id`:可选,供 `current_chat` scope 生成 session 过滤条件。
- `query`:必填。
- `scope`:保留 `current_chat``resources``all_user_memory`
- `app_id``project_id`:默认 `default`
新增或扩展字段:
- `agent_id`:可选。存在时,上游搜索使用 `agent_id`;不存在时使用
Gateway 鉴权用户的 `user_id`。请求中不会同时向上游发送两种 owner ID。
- `method`:支持 `keyword``vector``hybrid``agentic`,默认 `hybrid`
- `top_k`:支持 `-1``1..100`,保留 Gateway 默认值 `8`
- `radius`:可选,范围 `0..1`
- `include_profile`:布尔值,默认 `true`
- `enable_llm_rerank`:布尔值,默认 `true`
- `filters`:可选对象,支持上游开放字段过滤 DSL包括嵌套 `AND``OR`
`agent_id` 只改变上游记忆 owner不替代 Gateway 的 `user_id/user_key` 鉴权。
这可以防止调用者绕过 Gateway 用户体系,同时允许同一已认证用户查询被授权
使用的 agent memory。当前版本不新增 agent 权限表,因此仅校验 Gateway 用户
凭据,不声明 agent 的独立所有权关系。
## 搜索编排与过滤器合并
每一次上游 search 调用都必须透传:
- owner`agent_id``user_id`,二选一;
- `query`
- `method`
- `top_k`
- `radius`,仅在请求提供时发送;
- `include_profile`
- `enable_llm_rerank`
- `app_id`
- `project_id`
- 合并后的 `filters`
现有 scope 继续生成内部 session 条件:
- `current_chat``session_id = chat:{conversation_id}`
- `resources`:按批次生成 `session_id in [...]`
- `all_user_memory`:不生成 session 条件。
当请求同时提供自定义 `filters` 和 scope session 条件时,使用以下结构合并:
```json
{
"AND": [
{"自定义过滤条件": "..."},
{"session_id": "scope 生成的条件"}
]
}
```
仅存在其中一个条件时直接使用该条件;两者都不存在时不发送 `filters`
Gateway 不解析或重写自定义过滤 DSL 的内部字段,由上游执行完整校验。
`agent_id` 与所有 scope 均可组合。对于没有对应数据的组合,上游自然返回空数组;
Gateway 不额外禁止这些组合,以保持接口简单并完整透传搜索能力。
## 响应标准化
继续返回 Gateway 的统一结构:
```json
{
"results": []
}
```
每个结果新增 `memory_type`
| 上游数组 | `memory_type` |
|---|---|
| `episodes` | `episode` |
| `profiles` | `profile` |
| `agent_cases` | `agent_case` |
| `agent_skills` | `agent_skill` |
| `unprocessed_messages` | `unprocessed_message` |
其余字段保持现状:`id``session_id``text``score``source_scope`
`resource_id``resource_uri``raw`
profile 和 agent skill 等没有 `session_id` 的结果允许返回 `null`。资源映射只对
能匹配当前用户资源 session 的结果生效,不泄露其他用户的内部资源 URI。
所有类型的结果继续按现有顺序执行:
1. 合并各 scope 的结果;
2. 应用当前用户的 memory tombstone
3. 按 memory ID 应用当前用户的 active override
4. 返回统一结果。
## 错误处理
- 不合法的 `method``top_k``radius` 由 Gateway 请求模型返回 HTTP 422。
- 上游过滤 DSL 错误和其他 HTTP 错误继续由现有 client 行为向外传播。
- 不改变当前 `current_chat` 缺少 `conversation_id` 时跳过该 scope 的行为。
- 不为 `agent_id` 引入新的数据库表或权限模型。
## 代码改动
- `core/api.py`
- 扩展 `SearchMemoriesRequest`
- 将新增参数传给 service。
- `core/service.py`
- 扩展 `search_memories``_search_payload`
- 合并自定义 filters 与 scope filters。
- 标准化结果时增加 `memory_type`
- `tests/test_gateway.py`
- 验证默认参数透传。
- 验证全部自定义搜索选项透传。
- 验证 agent owner 与用户鉴权身份分离。
- 验证 filters 与 scope 条件使用 `AND` 合并。
- 验证五类结果的 `memory_type`
- `README.md`
- 更新 `/memories/search` 参数和响应说明。
## 验收标准
1. 未提供新字段时,上游收到 `method=hybrid``include_profile=true`
`enable_llm_rerank=true`
2. 所有上游搜索选项均能通过 Gateway 请求并原样传递。
3. `top_k=-1` 被接受,`top_k=0` 和范围外值被拒绝。
4. 自定义 filters 不会覆盖 scope 的资源或聊天 session 隔离条件。
5. 设置 `agent_id` 后,上游只收到 `agent_id`Gateway 仍使用
`user_id/user_key` 完成鉴权。
6. 每个搜索结果包含准确的 `memory_type`
7. 现有 tombstone、override、资源 URI 隔离测试继续通过。