Aeria
GitHub
改 · 3.16

人生时间线的数据

最后核对 2026-10-08对应提交 79735c5依据 timeline.py · now.py · storage.py · bot.py · webui.py

人生时间线是两张表、十种记录、三种范围。这一篇讲谁往里写、按什么编号不重复、怎么读、什么时候删,以及加一种记录要动哪几处。

本页 7 节
  1. 两张表
  2. 谁写
  3. 谁读
  4. 什么时候删
  5. 加一种记录
  6. 对应的代码
  7. 没做到的

行为层面的讲法见 2.15。

两张表

life_timeline (
  entry_id TEXT PRIMARY KEY,   -- 按来源编号:activity:<计划>、sleep:<会话>、chat:<频道>:<开始毫秒>、commitment:<消息>:<第几条>……
  kind, started_at, ended_at,  -- 十种之一;结束时间空着 = 还在进行
  scope,                       -- self | guild:<服务器> | dm:<对方>
  guild_id, channel_id,
  title,                       -- 最长 120 字:活动标题、承诺的一句概括
  detail_json,                 -- 各说了几轮、睡了几小时、状态……
  fact_weight,                 -- 0 到 1:梦是 0,说不准做没做完的活动是 0.5
  source_ref, updated_at
)
life_timeline_people (entry_id, user_id)   -- 这一条牵涉到谁(按人找、按人删都走它)

十种记录(timeline.KINDS):ACTIVITY、SLEEP、NAP、DREAM、DAYDREAM、CONVERSATION、OUTREACH、COMMITMENT、MILESTONE、CONDITION。TimelineEntry 构造时就查:种类不在表里、事实权重出了 0 到 1,直接抛。

谁写

写都走 storage.upsert_timeline_entries:按 entry_id 幂等,牵涉到的人整组换掉。

谁读

什么时候删

加一种记录

  1. cognition/timeline.py:KINDS 和 KIND_LABELS 各加一项(给模型看的说法);需要的话写一个 <种类>_entry 构造函数。
  2. 决定范围:人格自己的事用 SELF_SCOPE;和人有关的用 scope_of(guild_id=…, dm_user_id=…),并把人写进 people,删人时才删得到。
  3. 决定给不给模型:facts_for_prompt 默认会带上(事实权重大于 0 的);不该带的在那里排除。
  4. 决定留多久:和人有关的种类加进 cleanup_messages 里那条过期查询。
  5. 后台要显示:webui_frontend/src/routes/Life.tsx、Person.tsx 里各有一张种类到中文的表。

对应的代码

没做到的