91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
#!/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→512(deepseek对过小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()
|