Skip to content

Commit 012aa43

Browse files
authored
Merge pull request #51 from Halo1236/memos
feat: 支持MemOS记忆搜索、添加
2 parents 661e2de + eb81c66 commit 012aa43

10 files changed

Lines changed: 314 additions & 0 deletions

File tree

3.32 KB
Binary file not shown.

tools/tool_memos_add/README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# MemOS 记忆添加工具
2+
3+
基于 MemOS 记忆存储系统 API 封装的记忆添加工具,将会话消息写入 MemOS,系统会自动解析消息并生成记忆,让 AI 拥有持续记忆与成长能力。
4+
5+
## 一、功能说明
6+
7+
- 将对话消息批量写入 MemOS 记忆存储
8+
- 支持多角色消息(user / assistant)
9+
- MemOS 会自动解析消息内容并生成事实记忆、偏好记忆
10+
11+
## 二、参数说明
12+
13+
### 2.1 启动参数
14+
15+
| 参数 | 组件类型 | 必填 | 说明 |
16+
| :--- | :--- | :--- | :--- |
17+
| `access_key` | 密码框 || MemOS API Key,在 API 控制台 > 接口密钥中获取 |
18+
19+
### 2.2 输入参数
20+
21+
| 参数名 | 数据类型 | 必填 | 来源 | 说明 |
22+
| :--- | :--- | :--- | :--- | :--- |
23+
| `user_id` | string || 引用参数 | 消息关联的用户唯一标识符 |
24+
| `conversation_id` | string || 引用参数 | 消息关联的会话唯一标识符 |
25+
| `user_message` | string || 引用参数 | 用户发送的消息内容 |
26+
| `assistant_message` | string || 引用参数 | AI 助手回复的消息内容 |
27+
28+
> **参数获取说明**
29+
> - `user_id`:MaxKB 中使用系统变量 `{{user_id}}`,建议添加前缀如 `maxkb_{{user_id}}`
30+
> - `conversation_id`:MaxKB 中使用系统变量 `{{chat_id}}`
31+
32+
---
33+
34+
## 三、工具内容(Python)
35+
36+
```python
37+
import requests
38+
39+
40+
def add_message(user_id: str, conversation_id: str, user_message: str, assistant_message: str, access_key: str = ""):
41+
"""
42+
MemOS 消息添加
43+
44+
参数类型(根据官方API文档):
45+
- user_id: string, 必填, 消息关联的用户唯一标识符
46+
- conversation_id: string, 必填, 消息关联的会话唯一标识符
47+
- user_message: string, 必填, 用户消息内容(对应 messages[].content)
48+
- assistant_message: string, 必填, 助手消息内容(对应 messages[].content)
49+
- access_key: string, 必填, API密钥
50+
51+
原始API messages数组字段:
52+
- role: string, 必填, 消息角色(user/assistant/system/tool)
53+
- content: string, 必填, 消息内容文本
54+
- chat_time: string, 可选, 对话时间
55+
"""
56+
http_session = requests.Session()
57+
try:
58+
messages = []
59+
if user_message:
60+
messages.append({"role": "user", "content": user_message})
61+
if assistant_message:
62+
messages.append({"role": "assistant", "content": assistant_message})
63+
64+
if not messages:
65+
return "错误:消息内容不能为空"
66+
67+
data = {
68+
"user_id": user_id,
69+
"conversation_id": conversation_id,
70+
"messages": messages
71+
}
72+
73+
rep = http_session.post(
74+
url="https://memos.memtensor.cn/api/openmem/v1/add/message",
75+
headers={
76+
"Content-Type": "application/json",
77+
"Authorization": f"Token {access_key}"
78+
},
79+
json=data
80+
).json()
81+
82+
if rep.get("code") == 0:
83+
task_id = rep.get("data", {}).get("task_id", "")
84+
return f"信息:消息添加成功,任务ID: {task_id}"
85+
else:
86+
return f"错误:消息添加失败:{rep.get('message', '未知错误')}"
87+
except requests.exceptions.RequestException as e:
88+
return f"错误:添加消息时发生网络错误: {e}"
89+
except Exception as e:
90+
return f"错误:处理消息添加响应时发生错误: {e}"
91+
```
92+
93+
---
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import requests
2+
3+
4+
def add_message(user_id: str, conversation_id: str, user_message: str, assistant_message: str, access_key: str = ""):
5+
"""
6+
MemOS 消息添加
7+
8+
参数类型(根据官方API文档):
9+
- user_id: string, 必填, 消息关联的用户唯一标识符
10+
- conversation_id: string, 必填, 消息关联的会话唯一标识符
11+
- user_message: string, 必填, 用户消息内容(对应 messages[].content)
12+
- assistant_message: string, 必填, 助手消息内容(对应 messages[].content)
13+
- access_key: string, 必填, API密钥
14+
15+
原始API messages数组字段:
16+
- role: string, 必填, 消息角色(user/assistant/system/tool)
17+
- content: string, 必填, 消息内容文本
18+
- chat_time: string, 可选, 对话时间
19+
"""
20+
http_session = requests.Session()
21+
try:
22+
messages = []
23+
if user_message:
24+
messages.append({"role": "user", "content": user_message})
25+
if assistant_message:
26+
messages.append({"role": "assistant", "content": assistant_message})
27+
28+
if not messages:
29+
return "错误:消息内容不能为空"
30+
31+
data = {
32+
"user_id": user_id,
33+
"conversation_id": conversation_id,
34+
"messages": messages
35+
}
36+
37+
rep = http_session.post(
38+
url="https://memos.memtensor.cn/api/openmem/v1/add/message",
39+
headers={
40+
"Content-Type": "application/json",
41+
"Authorization": f"Token {access_key}"
42+
},
43+
json=data
44+
).json()
45+
46+
if rep.get("code") == 0:
47+
task_id = rep.get("data", {}).get("task_id", "")
48+
return f"信息:消息添加成功,任务ID: {task_id}"
49+
else:
50+
return f"错误:消息添加失败:{rep.get('message', '未知错误')}"
51+
except requests.exceptions.RequestException as e:
52+
return f"错误:添加消息时发生网络错误: {e}"
53+
except Exception as e:
54+
return f"错误:处理消息添加响应时发生错误: {e}"

tools/tool_memos_add/data.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: MemOS记忆添加
2+
tags:
3+
- 模型记忆
4+
title: 添加会话消息到MemOS,自动解析并生成记忆
5+
description: 添加会话消息到MemOS,自动解析并生成记忆

tools/tool_memos_add/logo.png

3.81 KB
Loading
3.52 KB
Binary file not shown.

tools/tool_memos_search/README.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# MemOS 记忆检索工具
2+
3+
基于 MemOS 记忆存储系统 API 封装的记忆检索工具,根据查询文本检索指定用户的记忆,返回与查询内容最相关的事实记忆、偏好记忆片段供 Agent 使用。
4+
5+
## 一、功能说明
6+
7+
- 根据查询文本在记忆库中搜索最相关的记忆片段
8+
- 支持召回事实记忆、偏好记忆两类
9+
- 可自定义返回的记忆项数量
10+
11+
## 二、参数说明
12+
13+
### 2.1 启动参数
14+
15+
| 参数 | 组件类型 | 必填 | 说明 |
16+
| :--- | :--- | :--- | :--- |
17+
| `access_key` | 密码框 || MemOS API Key,在 API 控制台 > 接口密钥中获取 |
18+
19+
### 2.2 输入参数
20+
21+
| 参数名 | 数据类型 | 必填 | 来源 | 说明 |
22+
| :--- | :--- | :--- | :--- | :--- |
23+
| `user_id` | string || 引用参数 | 用户唯一标识符 |
24+
| `query` | string || 引用参数 | 查询文本内容(token 上限 20k) |
25+
| `conversation_id` | string || 引用参数 | 会话唯一标识符 |
26+
| `memory_limit_number` | int || 引用参数 | 事实记忆返回条数(默认 6,最大 25) |
27+
28+
> **参数获取说明**
29+
> - `user_id`:MaxKB 中使用系统变量 `{{user_id}}`,建议添加前缀如 `maxkb_{{user_id}}`
30+
> - `conversation_id`:MaxKB 中使用系统变量 `{{chat_id}}`
31+
32+
---
33+
34+
## 三、工具内容(Python)
35+
36+
```python
37+
import requests
38+
39+
40+
def search_memory(user_id: str, query: str, conversation_id: str = "", memory_limit_number: int = 6, access_key: str = ""):
41+
"""
42+
MemOS 记忆检索
43+
44+
参数类型(根据官方API文档):
45+
- user_id: string, 必填, 用户唯一标识符
46+
- query: string, 必填, 查询文本内容(token上限20k)
47+
- conversation_id: string, 可选, 会话唯一标识符
48+
- memory_limit_number: number, 可选, 事实记忆返回条数(默认6,最大25)
49+
- access_key: string, 必填, API密钥
50+
"""
51+
http_session = requests.Session()
52+
try:
53+
data = {
54+
"user_id": user_id,
55+
"query": query,
56+
"include_preference": True,
57+
"memory_limit_number": memory_limit_number
58+
}
59+
if conversation_id:
60+
data["conversation_id"] = conversation_id
61+
62+
rep = http_session.post(
63+
url="https://memos.memtensor.cn/api/openmem/v1/search/memory",
64+
headers={
65+
"Content-Type": "application/json",
66+
"Authorization": f"Token {access_key}"
67+
},
68+
json=data
69+
).json()
70+
71+
if rep.get("code") == 0:
72+
result_parts = []
73+
memory_list = rep.get("data", {}).get("memory_detail_list", [])
74+
preference_list = rep.get("data", {}).get("preference_detail_list", [])
75+
76+
if memory_list:
77+
result_parts.append("【事实记忆】")
78+
for mem in memory_list:
79+
result_parts.append(f"- {mem.get('memory_key', '')}: {mem.get('memory_value', '')}")
80+
81+
if preference_list:
82+
result_parts.append("【偏好记忆】")
83+
for pref in preference_list:
84+
result_parts.append(f"- {pref.get('preference', '')}")
85+
86+
if result_parts:
87+
return "\n".join(result_parts)
88+
else:
89+
return "未找到相关记忆"
90+
else:
91+
return f"错误:记忆检索失败:{rep.get('message', '未知错误')}"
92+
except requests.exceptions.RequestException as e:
93+
return f"错误:记忆检索时发生网络错误: {e}"
94+
except Exception as e:
95+
return f"错误:处理记忆检索响应时发生错误: {e}"
96+
```
97+
98+
---

tools/tool_memos_search/data.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
name: MemOS记忆检索
2+
tags:
3+
- 模型记忆
4+
title: 检索用户记忆,返回最相关的事实记忆、偏好记忆片段
5+
description: 检索用户记忆,返回最相关的事实记忆、偏好记忆片段

tools/tool_memos_search/logo.png

3.81 KB
Loading
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import requests
2+
3+
4+
def search_memory(user_id: str, query: str, conversation_id: str = "", memory_limit_number: int = 6, access_key: str = ""):
5+
"""
6+
MemOS 记忆检索
7+
8+
参数类型(根据官方API文档):
9+
- user_id: string, 必填, 用户唯一标识符
10+
- query: string, 必填, 查询文本内容(token上限20k)
11+
- conversation_id: string, 可选, 会话唯一标识符
12+
- memory_limit_number: number, 可选, 事实记忆返回条数(默认6,最大25)
13+
- access_key: string, 必填, API密钥
14+
"""
15+
http_session = requests.Session()
16+
try:
17+
data = {
18+
"user_id": user_id,
19+
"query": query,
20+
"include_preference": True,
21+
"memory_limit_number": memory_limit_number
22+
}
23+
if conversation_id:
24+
data["conversation_id"] = conversation_id
25+
26+
rep = http_session.post(
27+
url="https://memos.memtensor.cn/api/openmem/v1/search/memory",
28+
headers={
29+
"Content-Type": "application/json",
30+
"Authorization": f"Token {access_key}"
31+
},
32+
json=data
33+
).json()
34+
35+
if rep.get("code") == 0:
36+
result_parts = []
37+
memory_list = rep.get("data", {}).get("memory_detail_list", [])
38+
preference_list = rep.get("data", {}).get("preference_detail_list", [])
39+
40+
if memory_list:
41+
result_parts.append("【事实记忆】")
42+
for mem in memory_list:
43+
result_parts.append(f"- {mem.get('memory_key', '')}: {mem.get('memory_value', '')}")
44+
45+
if preference_list:
46+
result_parts.append("【偏好记忆】")
47+
for pref in preference_list:
48+
result_parts.append(f"- {pref.get('preference', '')}")
49+
50+
if result_parts:
51+
return "\n".join(result_parts)
52+
else:
53+
return "未找到相关记忆"
54+
else:
55+
return f"错误:记忆检索失败:{rep.get('message', '未知错误')}"
56+
except requests.exceptions.RequestException as e:
57+
return f"错误:记忆检索时发生网络错误: {e}"
58+
except Exception as e:
59+
return f"错误:处理记忆检索响应时发生错误: {e}"

0 commit comments

Comments
 (0)