You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.3 KiB
150 lines
4.3 KiB
#!/usr/bin/env python3 |
|
""" |
|
mem0 OpenClaw Commands |
|
处理 /memory 命令 |
|
""" |
|
|
|
import os |
|
import sys |
|
|
|
# 设置环境变量 |
|
os.environ['OPENAI_API_BASE'] = 'https://dashscope.aliyuncs.com/compatible-mode/v1' |
|
os.environ['OPENAI_API_KEY'] = 'sk-c1715ee0479841399fd359c574647648' |
|
|
|
sys.path.insert(0, os.path.dirname(__file__)) |
|
|
|
from mem0_client import Mem0Client |
|
|
|
# 初始化客户端 |
|
mem0 = Mem0Client() |
|
|
|
def handle_memory_command(args: str, context: dict) -> str: |
|
""" |
|
处理 /memory 命令 |
|
|
|
Args: |
|
args: 命令参数 |
|
context: 上下文信息 (user_id, agent_id 等) |
|
|
|
Returns: |
|
回复文本 |
|
""" |
|
parts = args.split(' ', 2) |
|
action = parts[0] if parts else 'help' |
|
|
|
user_id = context.get('user_id', 'default') |
|
agent_id = context.get('agent_id', 'main') |
|
|
|
if action == 'add': |
|
content = parts[1] if len(parts) > 1 else '' |
|
return handle_add(content, user_id, agent_id) |
|
elif action == 'search': |
|
query = parts[1] if len(parts) > 1 else '' |
|
return handle_search(query, user_id, agent_id) |
|
elif action == 'list': |
|
return handle_list(user_id, agent_id) |
|
elif action == 'delete': |
|
memory_id = parts[1] if len(parts) > 1 else '' |
|
return handle_delete(memory_id, user_id, agent_id) |
|
elif action == 'status': |
|
return handle_status() |
|
else: |
|
return get_help() |
|
|
|
def handle_add(content: str, user_id: str, agent_id: str) -> str: |
|
"""添加记忆""" |
|
if not content: |
|
return "❌ 请提供记忆内容\n\n用法:/memory add <内容>" |
|
|
|
result = mem0.add([{"role": "user", "content": content}], user_id=user_id) |
|
|
|
if result and 'error' in result: |
|
return f"❌ 添加失败:{result['error']}" |
|
|
|
return f"✅ 记忆已添加\n\n📝 内容:{content[:200]}..." |
|
|
|
def handle_search(query: str, user_id: str, agent_id: str) -> str: |
|
"""搜索记忆""" |
|
if not query: |
|
return "❌ 请提供搜索关键词\n\n用法:/memory search <关键词>" |
|
|
|
results = mem0.search(query, user_id=user_id, limit=5) |
|
|
|
if not results: |
|
return f"🔍 未找到与 \"{query}\" 相关的记忆" |
|
|
|
response = f"🔍 找到 {len(results)} 条相关记忆:\n\n" |
|
for i, mem in enumerate(results, 1): |
|
memory_text = mem.get('memory', 'N/A') |
|
response += f"{i}. {memory_text}\n" |
|
if mem.get('created_at'): |
|
response += f" 📅 {mem['created_at']}\n" |
|
response += "\n" |
|
|
|
return response |
|
|
|
def handle_list(user_id: str, agent_id: str) -> str: |
|
"""列出所有记忆""" |
|
results = mem0.get_all(user_id=user_id) |
|
|
|
if not results: |
|
return "📭 暂无记忆" |
|
|
|
response = f"📋 共 {len(results)} 条记忆:\n\n" |
|
for i, mem in enumerate(results[:20], 1): |
|
memory_text = mem.get('memory', 'N/A') |
|
truncated = memory_text[:100] + '...' if len(memory_text) > 100 else memory_text |
|
response += f"{i}. {truncated}\n" |
|
response += f" 🆔 {mem.get('id', 'N/A')}\n\n" |
|
|
|
if len(results) > 20: |
|
response += f"... 还有 {len(results) - 20} 条记忆\n" |
|
|
|
return response |
|
|
|
def handle_delete(memory_id: str, user_id: str, agent_id: str) -> str: |
|
"""删除记忆""" |
|
if not memory_id: |
|
return "❌ 请提供记忆 ID\n\n用法:/memory delete <ID>" |
|
|
|
success = mem0.delete(memory_id, user_id=user_id) |
|
|
|
if success: |
|
return f"✅ 记忆已删除:{memory_id}" |
|
else: |
|
return f"❌ 删除失败:记忆不存在或权限不足" |
|
|
|
def handle_status() -> str: |
|
"""查看状态""" |
|
status = mem0.get_status() |
|
|
|
response = "📊 mem0 状态:\n\n" |
|
response += f"本地记忆:{'✅' if status['initialized'] else '❌'}\n" |
|
response += f"Qdrant 地址:{status['qdrant']}\n" |
|
|
|
return response |
|
|
|
def get_help() -> str: |
|
"""获取帮助文本""" |
|
return """📖 mem0 记忆管理命令 |
|
|
|
用法:/memory <命令> [参数] |
|
|
|
可用命令: |
|
add <内容> - 添加记忆 |
|
search <关键词> - 搜索记忆 |
|
list - 列出所有记忆 |
|
delete <ID> - 删除记忆 |
|
status - 查看状态 |
|
help - 显示帮助 |
|
|
|
示例: |
|
/memory add 用户偏好使用 UTC 时区 |
|
/memory search 时区 |
|
/memory list |
|
/memory status""" |
|
|
|
# 测试 |
|
if __name__ == '__main__': |
|
print("测试 /memory 命令...") |
|
print(handle_status())
|
|
|