replace main with lightweight memory gateway

This commit is contained in:
2026-06-11 10:06:48 +08:00
parent 000415404b
commit b74923e435
56 changed files with 2052 additions and 76129 deletions

View File

@ -1,77 +0,0 @@
输入user_id和session_id插入memories
curl -X POST "http://localhost:1995/api/v1/memories" \
-H "Content-Type: application/json" \
-d '{
"user_id": "user_001",
"session_id": "default",
"messages": [
{
"message_id": "msg_007",
"timestamp": 1778724000000,
"role": "user",
"content": "我喜欢喝拿铁,不喜欢美式。"
}
]
}'
{"data":{"request_id":"4535506c-26b6-4741-be62-3723db7a552c","message_count":1,"status":"accumulated","message":"Messages accepted"}
status=accumulated 表示先缓存了等待边界检测status=extracted 才表示已经触发记忆提取。
如果想强制触发总结/提取:调用 flush
curl -X POST "http://localhost:1995/api/v1/memories/flush" -H "Content-Type: application/json" -d '{
"user_id": "user_001",
"session_id": "default"
}'
{"data":{"request_id":"cc3e24be-9127-41aa-aefe-2ee80eacd054","status":"extracted","message":"Flush completed"}}
curl -X POST "http://localhost:1995/api/v1/memories/search" \
-H "Content-Type: application/json" \
-d '{
"query": "Tom 喜欢喝什么咖啡?",
"method": "hybrid",
"memory_types": ["episodic_memory", "profile"],
"filters": {
"user_id": "user_001"
},
"top_k": 10,
"include_original_data": true
}'
{"data":{"episodes":[],"profiles":[{"id":"6a058e72e0fcbba549ae94d8","user_id":"user_001","group_id":"gen_solo_669f08bf6134","profile_data":{"item_type":"explicit_info","embed_text":"饮食偏好: 喜欢喝拿铁,不喜欢美式咖啡"},"scenario":"solo","memcell_count":1,"score":0.7263925671577454}],"raw_messages":[],"agent_memory":null,"query":{"text":"Tom 喜欢喝什么咖啡?","method":"hybrid","filters_applied":{"user_id":"user_001"}},"original_data":{"episodes":{},"profiles":{}}}}
按用户/群组/时间拉取记忆:
curl -X POST "http://localhost:1995/api/v1/memories/get" \
-H "Content-Type: application/json" \
-d '{
"memory_type": "episodic_memory",
"filters": {
"user_id": "user_001"
},
"page": 1,
"page_size": 20,
"rank_by": "timestamp",
"rank_order": "desc"
}'
{"data":{"episodes":[{"id":"6a058e5de0fcbba549ae94d6","user_id":"user_001","group_id":"gen_solo_669f08bf6134","session_id":"default","timestamp":"2026-05-14T02:00:00Z","participants":["user_001"],"sender_ids":["user_001"],"summary":"2026年5月14日星期四凌晨02:00 UTC汤姆明确表达了自己的咖啡偏好。他陈述喜爱饮用拿铁咖啡同时明确表示不偏好美式咖啡。","subject":"汤姆于2026年5月14日凌晨表达咖啡口味偏好","episode":"2026年5月14日星期四凌晨02:00 UTC汤姆明确表达了自己的咖啡偏好。他陈述喜爱饮用拿铁咖啡同时明确表示不偏好美式咖啡。","type":"Conversation","parent_type":"memcell","parent_id":"6a058e46e0fcbba549ae94d3"}],"profiles":[],"agent_cases":[],"agent_skills":[],"total_count":1,"count":1}}
查 profile 画像:
(OpenViking) tom@tom:~$ curl -X POST "http://localhost:1995/api/v1/memories/get" \
-H "Content-Type: application/json" \
-d '{
"memory_type": "profile",
"filters": {
"user_id": "user_001"
},
"page": 1,
"page_size": 20
}'
{"data":{"episodes":[],"profiles":[{"id":"6a058e71e0fcbba549ae94d7","user_id":"user_001","group_id":"gen_solo_669f08bf6134","profile_data":{"id":null,"memory_type":"profile","user_id":"user_001","user_name":null,"timestamp":"2026-05-14T08:57:00.574433+00:00","group_id":"gen_solo_669f08bf6134","explicit_info":[{"category":"饮食偏好","description":"喜欢喝拿铁,不喜欢美式咖啡","evidence":"2026年5月14日用户明确表示“我喜欢喝拿铁不喜欢美式。”","sources":["6a058e46e0fcbba549ae94d3"]}],"implicit_traits":[],"last_updated":"2026-05-14T08:57:21.222404+00:00","processed_episode_ids":["6a058e46e0fcbba549ae94d3"]},"scenario":"solo","memcell_count":1}],"agent_cases":[],"agent_skills":[],"total_count":1,"count":1}}

View File

@ -1,71 +0,0 @@
创建用户
curl -sS -X POST "http://localhost:1934/memory-system/users" \
-H "Content-Type: application/json" \
-d '{"user_id":"userC"}'
{"status":"success","account":{"status":"ok","result":{"account_id":"userC_account","admin_user_id":"userC","isolate_user_scope_by_agent":false,"isolate_agent_scope_by_user":false,"user_key":"dXNlckNfYWNjb3VudA.dXNlckM.ZDFlMGI2OWI0NzZkZmZiMGExOWFlNGQ2N2JjYzMxNTg4NzVjZmNhN2Q4MTYwYmU1NGE4YWZjZTdjYzliMDI3NQ"},"error":null,"telemetry":null,"profile":null},"backends":{"openviking":{"status":"success","result":{"status":"ok","result":{"account_id":"userC_account","admin_user_id":"userC","isolate_user_scope_by_agent":false,"isolate_agent_scope_by_user":false,"user_key":"dXNlckNfYWNjb3VudA.dXNlckM.ZDFlMGI2OWI0NzZkZmZiMGExOWFlNGQ2N2JjYzMxNTg4NzVjZmNhN2Q4MTYwYmU1NGE4YWZjZTdjYzliMDI3NQ"},"error":null,"telemetry":null,"profile":null},"error":null}}}
插入信息
curl -sS -X POST "http://localhost:1934/memory-system/messages" \
-H "Content-Type: application/json" \
-d '{
"user_id": "userC",
"user_key": "dXNlckNfYWNjb3VudA.dXNlckM.ZDFlMGI2OWI0NzZkZmZiMGExOWFlNGQ2N2JjYzMxNTg4NzVjZmNhN2Q4MTYwYmU1NGE4YWZjZTdjYzliMDI3NQ",
"session_id": "sessionC1",
"user_message": "我喜欢拿铁。",
"assistant_message": "好的,我记住了。"
}'
存储记忆
curl -sS -X POST "http://localhost:1934/memory-system/sessions/sessionC1/commit" \
-H "Content-Type: application/json" \
-d '{
"user_id": "userC",
"user_key": "dXNlckNfYWNjb3VudA.dXNlckM.ZDFlMGI2OWI0NzZkZmZiMGExOWFlNGQ2N2JjYzMxNTg4NzVjZmNhN2Q4MTYwYmU1NGE4YWZjZTdjYzliMDI3NQ"
}'
全局搜索
curl -sS -X POST "http://localhost:1934/memory-system/search" \
-H "Content-Type: application/json" \
-d '{
"user_id": "userC",
"user_key": "dXNlckNfYWNjb3VudA.dXNlckM.ZDFlMGI2OWI0NzZkZmZiMGExOWFlNGQ2N2JjYzMxNTg4NzVjZmNhN2Q4MTYwYmU1NGE4YWZjZTdjYzliMDI3NQ",
"session_id": "sessionC1",
"query": "大语言模型应用是什么",
"limit": 10,
"level": 2,
"score_threshold": 0.8
}' | jq .
curl -s -X POST http://localhost:1933/api/v1/search/search \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 3f7a4b4faae1e2d49583a0e45d9ba5b51f3d0f545d97c9b6c4f19171f717e8af" \
-d '{
"query": "大语言模型应用是什么",
"level": 2
}' | jq .
会话查询
curl -sS -X POST "http://localhost:1934/memory-system/sessions/sessionB1/context" \
-H "Content-Type: application/json" \
-d '{
"user_id": "userB",
"user_key": "1e5f24acba77017e7506e6df9d668aebc0ddc91c4ed9af77c6d8da5e9d4ed6c7",
"query": "我喜欢喝什么?",
"limit": 10
}' | jq .
用户画像查询
curl -sS -X POST "http://localhost:1934/memory-system/users/userB/profile" \
-H "Content-Type: application/json" \
-d '{
"user_key": "1e5f24acba77017e7506e6df9d668aebc0ddc91c4ed9af77c6d8da5e9d4ed6c7",
"query": "我想喝东西",
"limit": 10,
"level": 2
}' | jq .
上传文件

View File

@ -1,390 +0,0 @@
# OpenViking Memory API 流程说明
> 本文档整理 OpenViking 中「创建账号/用户 → 创建 session → 写入消息 → commit 抽取长期 memory → 查询 task 状态 → 检索 user memory/session memory」的完整 API 流程。
>
> 出于安全原因,示例中不写入真实 `root_api_key` 或 `user_key`,统一使用环境变量占位。
## 0. 前置变量
```bash
# 在config.yaml里设置的 openviking url 和 api_key
export OV_HOST="http://localhost:1933"
export ROOT_KEY="your-secret-root-key"
# 创建用户后填入返回的 user_key
export USER_A_KEY="<userA-user-key>"
export USER_B_KEY="<userB-user-key>"
```
OpenViking 的常见鉴权方式:
| 场景 | Header |
|---|---|
| Admin API例如创建 account | `X-API-Key: $ROOT_KEY` |
| 普通用户 API例如 session/message/search | `X-API-Key: $USER_A_KEY` |
---
## 1. 创建用户隔离工作区 / account
Admin API 用于多租户管理。Memory Gateway 为每个业务用户直接创建一个 admin account不再调用 `/api/v1/admin/accounts/admin/users`
```bash
curl -X POST "$OV_HOST/api/v1/admin/accounts" \
-H "X-API-Key: $ROOT_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": "userA_account",
"admin_user_id": "userA"
}'
```
典型返回:
```json
{
"status": "ok",
"result": {
"account_id": "userA_account",
"admin_user_id": "userA",
"user_key": "<userA-user-key>"
},
"error": null,
"telemetry": null
}
```
---
## 2. 创建更多用户
### 2.1 创建 userA
```bash
curl -X POST "$OV_HOST/api/v1/admin/accounts" \
-H "X-API-Key: $ROOT_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": "userA_account",
"admin_user_id": "userA"
}'
```
返回后保存:
```bash
export USER_A_KEY="<userA-user-key>"
```
### 2.2 创建 userB
```bash
curl -X POST "$OV_HOST/api/v1/admin/accounts" \
-H "X-API-Key: $ROOT_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": "userB_account",
"admin_user_id": "userB"
}'
```
返回后保存:
```bash
export USER_B_KEY="<userB-user-key>"
```
> 注意:不同用户必须使用各自的 `user_key`。用 userA 的 key 只能访问 userA 的用户空间,用 userB 的 key 只能访问 userB 的用户空间。
---
## 3. 创建 session
Session 是会话容器用于保存消息、跟踪上下文使用、commit 后抽取长期 memories。
### 3.1 创建 userA 的 sessionA1
```bash
curl -X POST "$OV_HOST/api/v1/sessions" \
-H "X-API-Key: $USER_A_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "sessionA1"
}'
```
典型返回:
```json
{
"status": "ok",
"result": {
"session_id": "sessionA1",
"user": {
"account_id": "userA_account",
"user_id": "userA",
"agent_id": "default"
}
},
"error": null,
"telemetry": null
}
```
### 3.2 创建 userB 的 sessionB1
```bash
curl -X POST "$OV_HOST/api/v1/sessions" \
-H "X-API-Key: $USER_B_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "sessionB1"
}'
```
---
## 4. 写入 session 消息
HTTP API 支持简单文本模式:`role + content``role` 通常为 `user``assistant`
### 4.1 写入 userA / sessionA1 消息
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionA1/messages" \
-H "X-API-Key: $USER_A_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "user",
"content": "我喜欢用 Python 写数据分析脚本。"
}'
```
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionA1/messages" \
-H "X-API-Key: $USER_A_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "assistant",
"content": "好的,我会记住你偏好 Python 数据分析。"
}'
```
### 4.2 写入 userB / sessionB1 消息
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionB1/messages" \
-H "X-API-Key: $USER_B_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "user",
"content": "我喜欢用 vibe coding 写项目。"
}'
```
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionB1/messages" \
-H "X-API-Key: $USER_B_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "assistant",
"content": "好的,我会记住你偏好 vibe coding 项目。"
}'
```
---
## 5. Commit session触发长期 memory 抽取
`commit` 是两阶段流程:
1. **Phase 1同步完成**:把当前 live messages 快照归档,创建 archive 目录,清空 live session。
2. **Phase 2异步完成**:生成 session 摘要,抽取长期 memories更新关系和 active count。
因此 `commit` 请求会很快返回 `task_id`,后续要轮询 task 状态。
### 5.1 Commit userA / sessionA1
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionA1/commit" \
-H "X-API-Key: $USER_A_KEY" \
-H "Content-Type: application/json" \
-d '{
"keep_recent_count": 0
}'
```
典型返回:
```json
{
"status": "ok",
"result": {
"session_id": "sessionA1",
"status": "accepted",
"task_id": "fe6510e1-fdee-4f2d-9f87-5e48b519c2a2",
"archive_uri": "viking://session/userA/sessionA1/history/archive_001",
"archived": true
}
}
```
### 5.2 Commit userB / sessionB1
```bash
curl -X POST "$OV_HOST/api/v1/sessions/sessionB1/commit" \
-H "X-API-Key: $USER_B_KEY" \
-H "Content-Type: application/json" \
-d '{
"keep_recent_count": 0
}'
```
---
## 6. 查询 commit task 状态
```bash
curl -s "$OV_HOST/api/v1/tasks/<task_id>" \
-H "X-API-Key: $USER_A_KEY" | jq .
```
成功完成后类似:
```json
{
"status": "ok",
"result": {
"task_id": "fe6510e1-fdee-4f2d-9f87-5e48b519c2a2",
"task_type": "session_commit",
"status": "completed",
"resource_id": "sessionA1",
"result": {
"session_id": "sessionA1",
"archive_uri": "viking://session/userA/sessionA1/history/archive_001",
"memories_extracted": {
"preferences": 1
},
"active_count_updated": 0
},
"error": null
},
"error": null,
"telemetry": null
}
```
关键字段说明:
| 字段 | 含义 |
|---|---|
| `status: completed` | Phase 2 已完成memory 抽取结束 |
| `result.archive_uri` | 本次归档目录 URI |
| `result.memories_extracted` | 本次 commit 提取到的 memory 分类计数,不是 memory 内容 |
| `active_count_updated` | 本次基于 `sessions/{id}/used` 使用记录更新的活跃计数数量 |
如果返回:
```json
"status": "running"
```
说明后台任务还没完成。此时可以稍后继续查询同一个 task。
---
## 7. 用 `search/find` 向量搜索 user 长期 memory
`find` 是纯向量检索,不使用 session 上下文,也不做意图分析。适合直接按语义检索用户长期 memory。
使用显式用户路径:
```bash
curl -s -X POST "$OV_HOST/api/v1/search/find" \
-H "Content-Type: application/json" \
-H "X-API-Key: $USER_A_KEY" \
-d '{
"query": "我之前说了什么",
"target_uri": "viking://user/userA/memories/",
"limit": 3
}' | jq .
```
典型返回:
```json
{
"status": "ok",
"result": {
"memories": [
{
"context_type": "memory",
"uri": "viking://user/userA/memories/preferences/mem_xxx.md",
"level": 2,
"score": 0.7411,
"abstract": "Python 数据分析:偏好使用 Python 编写数据分析脚本"
}
],
"resources": [],
"skills": [],
"total": 1
}
}
```
---
## 9. 用 `search/search` 做带 session 上下文的 LLM 搜索
`search` 是智能检索:在 `find` 的基础上增加 session context、意图分析和 query expansion。它适合「用户当前对话里有上下文查询语义不完整」的场景。
```bash
curl -s -X POST "$OV_HOST/api/v1/search/search" \
-H "Content-Type: application/json" \
-H "X-API-Key: $USER_A_KEY" \
-d '{
"query": "我正在做什么",
"target_uri": "viking://user/userA/sessionA1", #
"session_id": "sessionA1",
"limit": 10,
}
```
典型返回:
```json
{
"status": "ok",
"result": {
"memories": [],
"resources": [],
"skills": [],
"total": 0,
"query_plan": {
"reasoning": "1. Conversational task (user asking '我正在做什么' - 'What am I doing?'); 2. This is a simple conversational query about current state/activity; 3. The session context contains the user's previous interactions about Python preferences and EverOS API questions; 4. No specific context gaps need to be filled for this conversational task, but a memory query about the user's current activity context could help provide a more personalized response",
"queries": [
{
"query": "User's current activity and task context",
"context_type": "memory",
"intent": "Understand what the user is currently working on to provide relevant context",
"priority": 3
}
]
}
}
}
```
---
## 10. `find` 与 `search` 的选择
| 接口 | 是否使用 session 上下文 | 是否做意图分析 | 适合场景 |
|---|---:|---:|---|
| `/api/v1/search/find` | 否 | 否 | 直接按 query 做向量检索,稳定查 user memory |
| `/api/v1/search/search` | 是,可传 `session_id` | 是 | 对话式检索,需要结合 session 语境、自动扩展 query |
推荐实践:
1. **验证 memory 是否已经写入**:先用 `tasks/{task_id}` 确认 `completed`
2. **确认 user 长期 memory 是否可召回**:用 `/api/v1/search/find`query 写得贴近 memory 内容。
3. **需要结合当前会话上下文**:再用 `/api/v1/search/search``session_id`

View File

@ -1,215 +0,0 @@
创建admin工作区
curl -X POST http://127.0.0.1:1933/api/v1/admin/accounts -H "X-API-Key: your-secret-root-key" -H "Content-Type: application/json" -d '{"account_id": "userB_account", "admin_user_id": "userB"}'
{"status":"ok","result":{"account_id":"userA_account","admin_user_id":"userA","isolate_user_scope_by_agent":false,"isolate_agent_scope_by_user":false,"user_key":"dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ"},"error":null,"telemetry":null,"profile":null}
{"status":"ok","result":{"account_id":"userB_account","admin_user_id":"userB","isolate_user_scope_by_agent":false,"isolate_agent_scope_by_user":false,"user_key":"dXNlckJfYWNjb3VudA.dXNlckI.YzZiNDZjMjJiZWMwNTM1OTBiOGEwMzAyOTFhZGMxZWQ4MTJhZDNhMmM5ZjJjZGYxMDI1YTkxZDVlMWY2M2M5MA"},"error":null,"telemetry":null,"profile":null}
创建用户
curl -X POST http://127.0.0.1:1933/api/v1/admin/accounts/admin/users -H "X-API-Key: your-secret-root-key" -H "Content-Type: application/json" -d '{"user_id": "userA", "role": "user"}'
userA
{"status":"ok","result":{"account_id":"admin","user_id":"userA","user_key":"3f7a4b4faae1e2d49583a0e45d9ba5b51f3d0f545d97c9b6c4f19171f717e8af"},"error":null,"telemetry":null}
userB
{"status":"ok","result":{"account_id":"admin","user_id":"userB","user_key":"3a017f01d1f9cddeec2b4832b4b3cb60b004ff27ec76505d72b24104412015c8"},"error":null,"telemetry":null}
创建session
userA
curl -X POST http://127.0.0.1:1933/api/v1/sessions \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-H "Content-Type: application/json" \
-d '{"session_id":"sessionA1"}'
A1
{"status":"ok","result":{"session_id":"238a22c1-a32a-4a3a-a174-2112d476173b","user":{"account_id":"admin","user_id":"userA","agent_id":"default"}},"error":null,"telemetry":null}
A2
{"status":"ok","result":{"session_id":"d20cede5-30ba-4d98-81f9-d74ee83bb071","user":{"account_id":"admin","user_id":"userA","agent_id":"default"}},"error":null,"telemetry":null}
B1
{"status":"ok","result":{"session_id":"654248bf-c36f-4a61-9fe8-de8f207d5227","user":{"account_id":"admin","user_id":"userB","agent_id":"default"}},"error":null,"telemetry":null}
B2
{"status":"ok","result":{"session_id":"c567601c-28e8-4b3d-be10-c95c909b374e","user":{"account_id":"admin","user_id":"userB","agent_id":"default"}},"error":null,"telemetry":null}
对话session插入massage
userA A1
curl -X POST http://localhost:1933/api/v1/sessions/sessionA1/messages \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-H "Content-Type: application/json" \
-d '{
"role": "user",
"content": "我喜欢用 Python 写数据分析脚本。"
}'
{"status":"ok","result":{"session_id":"sessionA1","message_count":1},"error":null,"telemetry":null}
curl -X POST http://localhost:1933/api/v1/sessions/sessionA1/messages \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-H "Content-Type: application/json" \
-d '{
"role": "assistant",
"content": "好的,我会记住你偏好 Python 数据分析。"
}'
{"status":"ok","result":{"session_id":"sessionA1","message_count":2},"error":null,"telemetry":null}
userB B1
curl -X POST http://localhost:1933/api/v1/sessions/sessionB1/messages \
-H "Authorization: Bearer 1e5f24acba77017e7506e6df9d668aebc0ddc91c4ed9af77c6d8da5e9d4ed6c7" \
-H "Content-Type: application/json" \
-d '{
"role": "user",
"content": "我还想喝咖啡,咖啡有力气"
}'
{"status":"ok","result":{"session_id":"sessionB1","message_count":1},"error":null,"telemetry":null}
curl -X POST http://localhost:1933/api/v1/sessions/sessionB1/messages \
-H "Authorization: Bearer 1e5f24acba77017e7506e6df9d668aebc0ddc91c4ed9af77c6d8da5e9d4ed6c7" \
-H "Content-Type: application/json" \
-d '{
"role": "assistant",
"content": "黑咖啡品味很浓,很有力气。"
}'
{"status":"ok","result":{"session_id":"sessionB1","message_count":2},"error":null,"telemetry":null}
对话session插入memory
userA A1
curl -X POST http://localhost:1933/api/v1/sessions/sessionA1/commit \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ"
{"status":"ok","result":{"session_id":"sessionA1","status":"accepted","task_id":"1b93fcde-0944-42ad-a819-4241faf0048f","archive_uri":"viking://session/sessionA1/history/archive_001","archived":true,"trace_id":""}}
userB B1
curl -X POST http://localhost:1933/api/v1/sessions/sessionB1/commit \
-H "Authorization: Bearer 1e5f24acba77017e7506e6df9d668aebc0ddc91c4ed9af77c6d8da5e9d4ed6c7" \
-H "Content-Type: application/json" \
-d '{"keep_recent_count":0}'
{"status":"ok","result":{"session_id":"sessionB1","status":"accepted","task_id":"cd98a696-ac6f-4f0c-8187-6e824f5ebcbc","archive_uri":"viking://session/userB/sessionB1/history/archive_001","archived":true}}
查询插入结果
userA A1
curl http://localhost:1933/api/v1/tasks/1b93fcde-0944-42ad-a819-4241faf0048f \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ"
{"status":"ok","result":{"task_id":"1b93fcde-0944-42ad-a819-4241faf0048f","task_type":"session_commit","status":"completed","created_at":1779855851.700087,"updated_at":1779855866.0683796,"resource_id":"sessionA1","result":{"session_id":"sessionA1","archive_uri":"viking://session/sessionA1/history/archive_001","memories_extracted":{"memory_write":1},"session_skills_extracted":0,"session_skill_uris":[],"active_count_updated":0,"token_usage":{"llm":{"prompt_tokens":7883,"completion_tokens":437,"total_tokens":8320},"embedding":{"total_tokens":49},"total":{"total_tokens":8369}}},"error":null,"created_at_iso":"2026-05-27T04:24:11.700087+00:00","updated_at_iso":"2026-05-27T04:24:26.068380+00:00"},"error":null,"telemetry":null,"profile":null}
userB B1
curl http://localhost:1933/api/v1/tasks/cd98a696-ac6f-4f0c-8187-6e824f5ebcbc \
-H "Authorization: Bearer 3a017f01d1f9cddeec2b4832b4b3cb60b004ff27ec76505d72b24104412015c8"
{"status":"ok","result":{"task_id":"cd98a696-ac6f-4f0c-8187-6e824f5ebcbc","task_type":"session_commit","status":"running","created_at":1779418133.2990522,"updated_at":1779418133.2993288,"resource_id":"sessionB1","result":null,"error":null},"error":null,"telemetry":null}
向量搜索用户memory
curl -X POST http://localhost:1933/api/v1/search/find \
-H "Content-Type: application/json" \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-d '{
"query": "我之前说了什么",
"limit": 3
}' | jq .
{"status":"ok","result":{"memories":[{"context_type":"memory","uri":"viking://user/userA/memories/preferences/mem_d49a95a2-8491-40bb-b0d3-4cf4c16d3de8.md","level":2,"score":0.7411142547036441,"category":"","match_reason":"","relations":[],"abstract":"Python 数据分析:偏好使用 Python 编写数据分析脚本","overview":null},{"context_type":"memory","uri":"viking://user/userA/memories/preferences/.abstract.md","level":0,"score":0.6752108627461267,"category":"","match_reason":"","relations":[],"abstract":"This directory contains a single user preference document that captures a specific behavioral attribute regarding tool choice for data analysis. The document is a lightweight, non-technical profile note intended to record that the user prefers writing d...","overview":null},{"context_type":"memory","uri":"viking://user/userA/memories/.overview.md","level":1,"score":0.6262621398392979,"category":"","match_reason":"","relations":[],"abstract":"User's long-term memory storage. Contains memory types like preferences, entities, events, managed hierarchically by type.","overview":null}],"resources":[],"skills":[],"total":3}}
LLM搜索用户session memory
curl -s -X POST http://localhost:1933/api/v1/search/search \
-H "Content-Type: application/json" \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-d '{
"query": "我正在做什么",
"limit": 10,
"level": 2
}' | jq .
{
"status": "ok",
"result": {
"memories": [],
"resources": [],
"skills": [],
"total": 0,
"query_plan": {
"reasoning": "1. Conversational task (user asking '我正在做什么' - 'What am I doing?'); 2. This is a simple conversational query about current state/activity; 3. The session context contains the user's previous interactions about Python preferences and EverOS API questions; 4. No specific context gaps need to be filled for this conversational task, but a memory query about the user's current activity context could help provide a more personalized response",
"queries": [
{
"query": "User's current activity and task context",
"context_type": "memory",
"intent": "Understand what the user is currently working on to provide relevant context",
"priority": 3
}
]
}
}
}
curl -X GET "http://localhost:1933/api/v1/sessions/sessionA1" \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ"
组装 session 上下文
curl -X GET "http://localhost:1933/api/v1/sessions/{session_id}/context" \
-H "X-API-Key: user key"
curl -X GET "http://localhost:1933/api/v1/sessions/sessionA1/context" \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" | jq .
获取指定 archive
curl -X GET "http://localhost:1933/api/v1/sessions/sessionA1/archives/archive_001" \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" | jq .
curl -sG "http://localhost:1933/api/v1/fs/ls" \
--data-urlencode "uri=viking://user/alice1/memories/preferences/" \
--data-urlencode "recursive=true" \
-H "X-API-Key: 1d1a4d61838f67d808230b19ed1b6b4ce647f073ea33ee005ed3b9b24f35b978" | jq
上传临时文件
curl -s -X POST http://localhost:1933/api/v1/resources/temp_upload \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-F "file=@/home/tom/memory-gateway/tests/大语言模型应用.pdf" \
| jq .
{
"status": "ok",
"result": {
"temp_file_id": "upload_89b818fa75114b35a5b2c55263dee8ff.pdf"
}
}
上传图片
curl -X POST http://localhost:1933/api/v1/resources \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-H "Content-Type: application/json" \
-d '{
"temp_file_id": "upload_89b818fa75114b35a5b2c55263dee8ff.pdf",
"to": "viking://resources/userA/files/大语言模型应用.pdf",
"reason": "userA 上传的文件",
"wait": true,
"directly_upload_media": true
}'
curl -X POST http://localhost:1933/api/v1/resources \
-H "X-API-Key: dXNlckFfYWNjb3VudA.dXNlckE.OGU4NzczZmQ2ZDExNjNhMWI4OTg2MWZkZTk5OTcyODlhNmM2ZTZjNDNmOGJkMWRiZDk2M2QyNTdhYTZmMTFlYQ" \
-H "Content-Type: application/json" \
-d '{
"temp_file_id": "upload_89b818fa75114b35a5b2c55263dee8ff.pdf",
"to": "viking://resources/userA/files/大语言模型应用.pdf",
"reason": "userA 上传的文件",
"wait": true,
"directly_upload_media": true
}'