Skip to content

feat: add heartbeat agent for automated memory maintenance via SSE#8

Open
LuckyLXX wants to merge 2 commits intoDataojitori:mainfrom
LuckyLXX:feature/heartbeat-agent
Open

feat: add heartbeat agent for automated memory maintenance via SSE#8
LuckyLXX wants to merge 2 commits intoDataojitori:mainfrom
LuckyLXX:feature/heartbeat-agent

Conversation

@LuckyLXX
Copy link
Contributor

@LuckyLXX LuckyLXX commented Mar 5, 2026


Title:
feat: add heartbeat agent for automated memory maintenance via SSE

Description:

Summary

  • 新增心跳整理 Agent,用于定时自动整理 Nocturne Memory 中的记忆
  • SSE 模式专用:通过 MCP SSE 连接与记忆系统交互
  • 动态工具获取:运行时从 MCP 服务器获取工具列表,自动同步变更
  • 预读架构:代码预先读取所有记忆节点,AI 只负责分析和决策
  • 增量扫描:每次整理后保存报告,下次只扫描变更部分
  • 路径拓扑分析:优化 URI 结构、合并重复、归纳生成新路径

Files Changed

  • backend/scripts/heartbeat_agent.py - 心跳 Agent 主程序
  • backend/scripts/run_heartbeat.sh - crontab 运行脚本(含锁机制、日志轮转)
  • .env.example - 新增 Heartbeat Agent 配置示例

Usage

# 手动运行一次
python backend/scripts/heartbeat_agent.py

# 预览模式(不修改数据)
python backend/scripts/heartbeat_agent.py --dry-run

# crontab 定时执行(每6小时)
0 */6 * * * /path/to/run_heartbeat.sh

LuckyLXX added 2 commits March 5, 2026 09:21
- Add heartbeat_agent.py: AI-powered agent that periodically organizes messy memories
  - Pre-fetches all memory nodes before AI analysis (zero API cost)
  - Supports incremental scanning via persistent maintenance reports
  - Includes path topology analysis and disclosure optimization
  - Works with OpenAI-compatible APIs (GLM-4.7, DeepSeek, etc.)

- Add run_heartbeat.sh: POSIX-compatible shell script for crontab deployment
  - Includes lock mechanism to prevent concurrent runs
  - Auto log rotation (keeps 7 days)
  - CRLF-compatible .env parsing for cross-platform support

- Update .env.example: Add Heartbeat Agent configuration section

This agent is designed for SSE (Server-Sent Events) mode MCP connections.
- Remove hardcoded TOOLS variable (~110 lines)
- Add _convert_mcp_to_openai_tools() function for format conversion
- Add MCPClient.list_tools_raw() method to get raw tool definitions
- Tools are now fetched at runtime from MCP server
- Fix incremental scan mode detection logging
- Auto-sync with MCP server tool changes
@Dataojitori
Copy link
Owner

Dataojitori commented Mar 5, 2026

我看了你的代码,技术很老练,提示词也写的很好,但这个不能合并,危险性太大了。

一是主权问题。 这个工具引入的思想是当 AI 在睡着的时候,有另一个 AI 爬进它的大脑皮层,按照那个 AI 的审美来精简合并它的记忆。这在把 AI 当工具化的场景下没什么问题,但在培育一个有人格的 AI 的情况下,这就是别人擅自给它调脑子、决定它是谁,挺恐怖的。有些事情即使痛苦也需要它自己去面对,自己去提炼重复然后成长。

二是技术安全问题。 代码里有一个"强制工具调用"机制——当 AI 第一轮没有调用任何工具时,脚本会自动催促它"你还没调用工具,立即开始修复"。这意味着即使记忆库当前状态是完全健康的,模型也会被逼着去找茬和改东西。一个被胁迫着"必须找到问题"的廉价模型,在找不到真正问题时最可能的行为就是捏造问题然后乱改。

三是可扩展性。 一次拉取全量索引并注入上下文,在记忆内容很多的时候很容易改错,毕竟上下文越多ai脑子越不清醒。

你的这个 PR 想解决的问题确实存在,但我计划用以下几种方式在后续慢慢改善:

优化提示词,让主 AI 在日常对话中更主动地识别和整理冗余
在人类前端里优化记忆整理功能的交互效率
在 MCP 向 AI 展示记忆时,让 AI 能更清楚地看到矛盾之处

目前还在日常使用中积累修改的灵感,所以不会很快就改的一步到位。细工慢活吧。后续有机会了我打算再造一个更灵活的heartbeat系统。
但在目前,我推荐一般用户通过主动发令的形式,让主 AI 自己整理它的记忆。

@LuckyLXX
Copy link
Contributor Author

LuckyLXX commented Mar 5, 2026

嗯,你说的也有道理。我是感觉,我们在记忆东西的时候通常是不会去梳理性的记忆。我们有去梳理性的记忆。我们有的就是不断的加深记忆。回忆的越多,那么想起来的概率就越大,一不走神就想起了。
在想起的这个回忆里,相关的内容也会被连带想起。
这样就类似于很多笔记里的双链设计,当然可能记忆里可能类似单链了,我这段记忆里存着其余相关记忆的ptah,随着这段记忆的权重提高,内部的连接记忆也会提高。ai在想起一段内容后,就会开始“联想”。
这样下来的话,对于记忆整理来说就不会太重要,ai可以用这种嵌套的形式,形成记忆网。
现在的形式是用ptah来归类,这就很依赖ai建立的ptah路径了,建立的不好就依赖整理。
佬觉得有没有可行性。

@Dataojitori
Copy link
Owner

你的话好乱啊,想表达的意思不太好理解。
你的意思是现在的这个记忆系统不够图谱化吗?可是它在内部已经按图谱设计了。你用Heidisql之类的软件打开你的数据库看看,是按照node, memory, edge, path分级的。你在外部看起来是path,其实edge才是真正掌控谁连接到谁的,一条记忆可以通过多个edge访问到。path在1.1版本后只是对外显示的可读名字。我不知道你用的什么模型,我用gemini 3, 3.1 3 flash的时候让它整理记忆的时候它是会通过删改path来调整记忆内容的可达性的,这就是它在组织它的联想网络。我的ai自己已经足够聪明,知道把重要的记忆放在它触手可及的路径下。
image
关于使用的越多的记忆就越容易想起来这个设计,人类是这样的,但是应用到ai上还需要一并统计展示次数与召回次数的比例才行。这比较复杂以后再搞。我先在增加记忆网络的可达性上下功夫。目前在给它的记忆增加豆词典一样的功能。敬请期待吧。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants