① 异步调度 timer-scanner.ts + pipeline-worker.ts
Timer Scanner(无主模式)
16 个分片 ZSET:tdai_memory:timers:shard_{0..15};成员 = instanceId\x00sessionId:type,score = fireAtMs。
- 所有 Pod 都扫描,无需选主
- Lua 原子认领 ZRANGEBYSCORE + ZREM,无重复消费
- 扫描间隔默认 2s,每 shard 每次最多 1000
→
任务队列
L1_idle / L2_schedule / L3 等任务类型入队。
- 级联:L1 完成 → 推进 L2 Timer;L2 完成 → 直接入队 L3
→
Pipeline Worker(竞争消费)
默认 60 并发协程;poll 200ms。
- 分布式锁:per-session(L1/L2)、per-instance(L3)
- 锁 TTL 10min,每 30s 续约,续约失败 abort
- LLM 执行 + 写入 VDB / COS
→
执行器
executeL1 / L2 / L3,调 LLM 提炼后写回。
- 重试:抢锁失败 5s 重投;LLM 超时指数退避 5s / 15s / 45s,最多 3 次
- 幂等:VDB upsert by record_id,COS 覆盖写
→
死信队列
超过重试上限的任务落死信,持久化错误供人工排查。
② 存储架构 数据库 + 文件双通道
vectors.db(数据面)
- l0_conversations 表(原始对话元数据)
- l0_vec 虚拟表(L0 向量)
- l1_records 表(原子记忆元数据)
- l1_vec 虚拟表(cosine)+ FTS5(BM25)
- skills / skill_fts / skill_vec(技能资产)
本地文件(L2/L3 权威)
- conversations/YYYY-MM-DD.jsonl(L0 原文)
- records/YYYY-MM-DD.jsonl(L1 备份)
- scene_blocks/*.md(L2 场景档案,文件权威)
- persona.md(L3 画像,全实例一份)
- .metadata/recall_checkpoint.json(进度)
metadata.db(管控面)
- meta_* 资产表:User / Team / Agent / Task / Asset
- 绑定关系、权限 ACL、版本状态
- memory_prompts / memory_generation_refs
data 面与管控面分离:
资产内容走 vectors.db;
绑定 / 权限 / 版本走 metadata.db