|
|
#!/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')}" |
|
|
}
|
|
|
|