它记得自己做过什么
它昨晚几点睡的、今天做过什么、刚才和谁聊过、主动找过谁,都记在同一条「人生时间线」上。聊天时它照着这条线说自己的事,不靠现编;线上只记发生过的事,不记聊天原话。
记哪些事
| 种类 | 记什么 |
|---|---|
| 做的事 | 哪一类、叫什么;做完了、做了一半、说不准做没做完,还是正在做 |
| 睡觉、打盹 | 几点睡、几点醒、睡了多久、睡得怎么样、被吵醒几次 |
| 梦 | 做过一个梦,有多清楚;不记内容 |
| 发呆 | 发过一会儿呆;想了什么、想到了谁都不记 |
| 聊天 | 和谁、在哪、从几点到几点、两边各说了几轮 |
| 主动找人 | 找了谁、他接没接、隔多久接的 |
| 答应的事 | 答应了什么、约好几点、做没做到(2.21) |
| 关系里程碑 | 哪一种(2.14) |
| 这几天的状态 | 小感冒、这几天事情多,从哪天开始、持续了几天 |
同一个地方隔了半个小时没人说话,再开口就算下一段聊天。
梦也进来,但标着「想象」,不算进它经历过的事。
不记原话
聊天只记人、地方、时间、轮数,不记谁说了什么。说过的话在聊天记录和记忆里(2.11),有各自的规矩;时间线只管「什么时候、和谁、发生过什么」。
谁看得到哪一段
- 它自己的事(做的事、睡觉、梦、发呆、这几天的状态)哪儿都看得到。
- 在一个服务器里发生的,只在那个服务器里看得到。
- 私聊里发生的,只在和那个人的私聊里看得到。
- 梦跟着做梦时的语境走:从某段私聊里的事梦出来的,只算那段私聊里的。
所以它在群里聊天时,想不起私聊里的事;在私聊里,也想不起任何服务器里的事。
聊天时它拿到什么
每次要拿主意、要说话之前,它会看一眼「此刻」:
- 身体:困不困、累不累、刚醒的迷糊劲、是不是不舒服;
- 手上在做什么、腾不腾得出手;
- 心情、压力;
- 最近一天半里经历过的事,最多八条,时间换成当地时间;聊天、主动找人、里程碑只标出是不是和眼前这个人,不给名字;
- 还欠着眼前这个人的事。
决定回不回的那一步和写回复的那一步看的是同一份「此刻」,主动找人时看的也是它。所以「正在忙、快睡了、很累、心情不好」会一起影响回不回、怎么说、找不找人,不会这边说累、那边照样聊得起劲。
留多久、在哪看
- 和人有关的(聊天、主动找人、答应的事、里程碑)跟聊天记录一起过期,默认 30 天;它自己的事留 180 天。
- 网页后台「生活连续性」页有「人生时间线」,默认看最近两天:它自己的事,加上当前选中的服务器里的事;私聊里的只给所有者看。
- 「人物画像」里点开一个人,「关系时间线」是和他有关的那几条。
对应的代码
- 时间线:
src/aeria/cognition/timeline.py(KINDS十种、CONVERSATION_GAP= 30 分钟、SELF_RETENTION= 180 天;范围self/guild:<编号>/dm:<编号>,visible_scopes;给模型的facts_for_prompt)。生活引擎的记录按来源编号同步进来(entries_from_life),聊天和主动联系在发出、被接的那一刻由src/aeria/bot.py写。 - 此刻:
src/aeria/cognition/now.py(RECENT_HOURS= 36、RECENT_LIMIT= 8;tiredness、occupied);拼起来的地方:bot.py的_now_snapshot。 - 存储:
src/aeria/storage.py的life_timeline、life_timeline_people两张表;过期在cleanup_messages([conversation].message_retention_days= 30)。 - 后台:
src/aeria/webui.py的/api/life/timeline(默认 2 天,最多 30 天;私聊的只给所有者)。 - 测试:
tests/test_life_timeline.py、tests/test_life_timeline_e2e.py、tests/test_commitment_ledger.py(「时间线给模型的事实里没有承诺_承诺单独给」)。
没做到的
- 时间线上的某一条,后台里不能单独删、单独改。
- 一段聊天什么时候算结束只看安静了多久:聊到一半去吃饭、四十分钟后接着聊,会被记成两段。