记忆计数与统计
wesgine 记忆的计数(用户面)与统计(运维面):两个端点回答不同问题。
按层计数(用户面)
GET /memory/counts?actor=alice&namespace=
返回每层条数,键覆盖全部七层含 0:
{
"environment": 12,
"consensus": 3,
"about_me": 8,
"agent_memory": 25,
"session": 0,
"working": 0,
"unknown": 0
}
关键约束(INV-MEM-52)
- 键对
AllMemoryLayers()全覆盖含 0 - 数字是
COUNT不是逐页折叠 - 数字必须 == 列表长度
缺键会让消费方渲染成「什么都没有」,而新加的层正是最可能缺键的。
与列表的一致性
同一句话的两种说法——counts 的数字 == list 的总行数。不一致时用户读作「列表被过滤了」。
运维统计(运维面)
GET /memory/stats?actor=&scope=&namespace=
按 scope 分区统计分布。
区别
| counts | stats | |
|---|---|---|
| 问题 | 我有多少条记忆? | 哪个分区的行需要被合并/统计/批删? |
| 维度 | 层 | scope + namespace |
| 权限 | cell:read | cell:admin |
| Actor | 必填 | 可选(管理视图) |
为什么 stats 用 scope 而非 layer
层回答「这行对谁可见」,回答不了「哪个存储分区的行需要被合并/统计/批删」。
/memory/digest(跨条目合并)、/memory/delete-by-meta(批删)和 /memory/stats(统计分布)三者都是运维面,按 scope 提问是对的。
layer 与 scope 互斥
Layer 与 Scope 同时给出返回 ErrMemoryLayerScopeConflict(400),不做交集。
理由:两者只在调用方糊涂时才分歧,返回交集是在回答没人问过的问题。
admin 的 actor 语义
?actor= 只对 admin token 生效;非 admin 一律取 Principal.Actor。
空 actor = 管理视图(全 Cell)。这不是「不过滤」,是 admin 的合法权限。
前端消费指南
- 芯片恒定渲染七层(含 0),分组列表只画非空层
- 计数用
counts,不要自己遍历条目累加 - 缺键渲染为 0 而不是不渲染
相关文档
- Memory 层模型 →
memory-layer-model.md - Actor 边界 →
actor-boundary.md - GC 与 Digest →
memory-gc-digest.md