Files
MoFin/deploy/profile-scripts/memory_guardian.py
T

91 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""memory_guardian.py — 记忆守卫 (no_agent)
每日运行,按SOUL记忆规则检查并清理:
1. MEMORY.md 是否存在、不超容量
2. 通过gateway自动清理共享memory中带[Agent:知微]的profile专属条目
3. 报告结果给Dad
有违规→输出报告 | 一切正常→SILENT
"""
import json, subprocess, urllib.request
from pathlib import Path
from datetime import datetime
# ── 消息通道统一路由(broadcast/xmpp by delivery) ──
try:
from messenger import install_stdio_hook as _msh
_msh()
except Exception:
pass
HOME = Path.home()
PROFILE = HOME / ".hermes" / "profiles" / "position-analyst"
MEMORY_FILE = PROFILE / "MEMORY.md"
MEMORY_MAX = 3000
MEMORY_WARN = 2400
ISSUES = []
def check_memory_md():
if not MEMORY_FILE.exists():
ISSUES.append("MEMORY.md 不存在!profile专属内容可能全部塞在共享memory中")
return
size = MEMORY_FILE.stat().st_size
if size > MEMORY_MAX:
ISSUES.append(f"MEMORY.md 超限: {size}/{MEMORY_MAX}字符 ({size-MEMORY_MAX}超出)")
elif size > MEMORY_WARN:
ISSUES.append(f"MEMORY.md 接近上限: {size}/{MEMORY_MAX}字符")
else:
print(f" ✅ MEMORY.md: {size}/{MEMORY_MAX}字符")
def cleanup_memory():
"""通过gateway自动清理共享memory中profile专属条目"""
try:
payload = json.dumps({
"model": "default",
"messages": [{"role": "user",
"content": "清理共享memory中所有带[Agent:知微]标签或Session:2026的条目。"
"这些应该放在MEMORY.md而非共享memory。"
"用memory(action='remove', old_text='唯一子串')逐条删除。"
"完成后回复'清理完成'。"}],
"max_tokens": 512, # 2026-08-14 修复:100→512deepseek对过小max_tokens返回空)
}).encode()
req = urllib.request.Request(
"http://localhost:8643/v1/chat/completions",
data=payload,
headers={"Content-Type": "application/json",
"Authorization": "Bearer hermes123",
"X-Hermes-Session-Id": "memory-guardian"}
)
resp = urllib.request.urlopen(req, timeout=120)
result = json.loads(resp.read())
reply = result["choices"][0]["message"]["content"]
return "清理完成" in reply, reply[:200]
except Exception as e:
return False, str(e)[:200]
def main():
print(f"记忆守卫 | {datetime.now().strftime('%Y-%m-%d %H:%M')}")
print()
check_memory_md()
ok, detail = cleanup_memory()
print(f" {'✅' if ok else '⚠️'} 共享memory清理: {'已完成' if ok else detail}")
if ISSUES:
print()
print(f"⚠️ 发现 {len(ISSUES)} 个问题:")
for i in ISSUES:
print(f" • {i}")
else:
print()
print("[SILENT] 记忆系统正常")
if __name__ == "__main__":
main()