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.
65 lines
2.1 KiB
65 lines
2.1 KiB
#!/usr/bin/env python3 |
|
"""OpenClaw 拦截器:Pre-Hook + Post-Hook |
|
三级可见性 + 记忆衰减 + 智能写入过滤 |
|
""" |
|
|
|
import asyncio |
|
import logging |
|
import sys |
|
sys.path.insert(0, '/root/.openclaw/workspace/skills/mem0-integration') |
|
from mem0_client import mem0_client |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class ConversationInterceptor: |
|
def __init__(self): |
|
self.enabled = True |
|
|
|
async def pre_hook(self, query: str, context: dict) -> str: |
|
if not self.enabled: |
|
return None |
|
try: |
|
user_id = context.get('user_id', 'default') |
|
agent_id = context.get('agent_id', 'general') |
|
memories = await mem0_client.pre_hook_search( |
|
query=query, user_id=user_id, agent_id=agent_id |
|
) |
|
if memories: |
|
return mem0_client.format_memories_for_prompt(memories) |
|
return None |
|
except Exception as e: |
|
logger.error(f"Pre-Hook 失败:{e}") |
|
return None |
|
|
|
async def post_hook(self, user_message: str, assistant_message: str, context: dict): |
|
if not self.enabled: |
|
return |
|
try: |
|
user_id = context.get('user_id', 'default') |
|
agent_id = context.get('agent_id', 'general') |
|
visibility = context.get('visibility') |
|
project_id = context.get('project_id') |
|
memory_type = context.get('memory_type') |
|
mem0_client.post_hook_add( |
|
user_message, assistant_message, |
|
user_id=user_id, |
|
agent_id=agent_id, |
|
visibility=visibility, |
|
project_id=project_id, |
|
memory_type=memory_type, |
|
) |
|
logger.debug(f"Post-Hook: 已提交对话") |
|
except Exception as e: |
|
logger.error(f"Post-Hook 失败:{e}") |
|
|
|
|
|
interceptor = ConversationInterceptor() |
|
|
|
|
|
async def intercept_before_llm(query: str, context: dict): |
|
return await interceptor.pre_hook(query, context) |
|
|
|
|
|
async def intercept_after_response(user_msg: str, assistant_msg: str, context: dict): |
|
await interceptor.post_hook(user_msg, assistant_msg, context)
|
|
|