개발자

lineage

기억 하나가 고쳐져 온 이력을 오래된 순으로 돌려줍니다. revisions 가 저장소 전체가 얼마나 움직였는지라면, 이쪽은 사실 하나에 무슨 일이 있었는지입니다.

Tablet 2 이상에서 지원합니다. 읽기 전용입니다. revisions 와 달리 기억 내용을 돌려주므로 일반 유료 호출입니다.

체인에 속한 아무 기억의 id 나 넘기면 됩니다. 대체된 판은 지우지 않고 보관하므로, 검색이 현재 사실만 돌려줘도 거슬러 올라갈 수 있습니다.

chain = mem.lineage(memory_id=mid)["chain"]
for step in chain:
    print(step["changed_at"], step["action"], step["content"])
const { chain } = await mem.lineage(undefined, mid);
for (const step of chain) {
  console.log(step.changed_at, step.action, step.content);
}
let r = mem.lineage(None, mid).await?;
for step in r["chain"].as_array().unwrap_or(&vec![]) {
    println!("{} {} {}", step["changed_at"], step["action"], step["content"]);
}
curl -X POST https://api.wontopos.com/api/v1/memory/lineage \
  -H "X-API-Key: $WOS_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","memory_id":"m_9"}'
200
{ "memory_id": "m_9", "count": 3, "truncated": false,
  "chain": [
    { "memory_id": "m_3", "content": "lives in Seoul",
      "created_at": "2026-03-02T…", "changed_at": "2026-06-11T…",
      "action": "replaced", "confidence": 0.94,
      "superseded_by": "m_7", "is_current": false },
    { "memory_id": "m_7", "content": "moved to Busan",   … },
    { "memory_id": "m_9", "content": "Haeundae, specifically",
      "changed_at": null, "superseded_by": null, "is_current": true }
  ] }
필드하는 일
chain판들을 오래된 순으로. 각 판은 기억과 같은 필드에 아래 넷이 더 붙습니다.
changed_at이 판이 대체된 시각(RFC3339). 아직 유효하면 null.
action이 자리에서 무슨 일이 있었는지. 대체본이 이 판과 어떤 관계였는지입니다.
confidence엔진이 그 관계를 얼마나 확신했는지, 0~1.
is_current지금 유효한 판에만 true. 체인당 정확히 하나입니다.
truncated체인이 서비스가 훑는 길이보다 길었으면 true. 돌려준 판들은 여전히 오래된 쪽입니다.

어디에 쓰나

둘입니다. 디버깅 — 이 기억이 왜 지금 이 모양인지 추적합니다. 그리고 어시스턴트가 자기 이력을 보는 것 — 세 번 고쳐진 사실은 한 번 쓰인 사실과 다른 종류이고, 그걸 보여주는 건 체인뿐입니다.