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.

105 lines
3.2 KiB

#!/usr/bin/env python3
"""
mem0 Client for OpenClaw (v1.0 兼容)
"""
import os
import logging
from typing import List, Dict, Optional
# 设置环境变量(在导入 mem0 之前)
os.environ['OPENAI_API_BASE'] = 'https://dashscope.aliyuncs.com/compatible-mode/v1'
os.environ['OPENAI_API_KEY'] = 'sk-c1715ee0479841399fd359c574647648'
try:
from mem0 import Memory
from mem0.configs.base import MemoryConfig, VectorStoreConfig, LlmConfig
except ImportError as e:
print(f" mem0ai 导入失败:{e}")
Memory = None
logger = logging.getLogger(__name__)
class Mem0Client:
def __init__(self):
self.local_memory = None
self.init_memory()
def init_memory(self):
"""初始化 mem0"""
if Memory is None:
logger.warning("mem0ai 未安装")
return
try:
config = MemoryConfig(
vector_store=VectorStoreConfig(
provider="qdrant",
config={
"host": os.getenv('MEM0_QDRANT_HOST', 'localhost'),
"port": int(os.getenv('MEM0_QDRANT_PORT', '6333')),
"collection_name": "mem0_local",
"on_disk": True
}
),
llm=LlmConfig(
provider="openai",
config={"model": "qwen-plus"}
)
)
self.local_memory = Memory(config=config)
logger.info("✅ 本地记忆初始化成功")
except Exception as e:
logger.error(f"❌ 初始化失败:{e}")
self.local_memory = None
def add(self, messages: List[Dict], user_id: str) -> Optional[Dict]:
"""添加记忆"""
if self.local_memory is None:
return {"error": "mem0 not initialized"}
try:
result = self.local_memory.add(messages, user_id=user_id)
return {"success": True}
except Exception as e:
return {"error": str(e)}
def search(self, query: str, user_id: str, limit: int = 5) -> List[Dict]:
"""搜索记忆"""
if self.local_memory is None:
return []
try:
return self.local_memory.search(query, user_id=user_id, limit=limit)
except Exception:
return []
def get_all(self, user_id: str) -> List[Dict]:
"""获取所有记忆"""
if self.local_memory is None:
return []
try:
return self.local_memory.get_all(user_id=user_id)
except Exception:
return []
def delete(self, memory_id: str, user_id: str) -> bool:
"""删除记忆"""
if self.local_memory is None:
return False
try:
self.local_memory.delete(memory_id, user_id=user_id)
return True
except Exception:
return False
def get_status(self) -> Dict:
"""获取状态"""
return {
"initialized": self.local_memory is not None,
"qdrant": f"{os.getenv('MEM0_QDRANT_HOST', 'localhost')}:{os.getenv('MEM0_QDRANT_PORT', '6333')}"
}