Skip to content

[bug] 图片记忆从入口到落库全断:三份 textOf 都只认 text 块,图块恒空串且无计数 #611

Closed

Description

@modusensus

现象

会话里的图片一条都进不了记忆 —— 不是「描述得不好」,是从消息入口到落库整条没接上,且全程无报错、无计数。

  • 图-only 消息:collectMessages 读出一串空文本 → publicTranscriptParts 返回 [] → 这一条整条不进转录;窗口里如果只有图,连蒸馏都不会触发(collected.messages.length === 0 直接 commitCursor 走人)。
  • 图+文消息:只剩文字,图那部分静默消失。
  • 事后无法回答「图到底进来没有」:两侧都没有任何计数,只能翻源码。

根因

三份 textOf 是同一个写法的副本,都只认 type:"text":

位置 说明
src/summarize.js(collectMessages 内) 蒸馏转录抽取
src/continuity.js 压缩边缘快照抽取
src/hot-memory.js(roundsFromEvents 内) 热记忆按轮抽取

三处都是 p?.type && p.type !== "text" → "",image 块一律空串。

本批修法(off 占位档)

把「块 → 文本」抽成唯一一份 src/attachment-text.js(blockToText / contentToText / countImages / imageLabel),三处调用方共用。抽一份而不是各加一遍 image 分支——同一件事写成三份迟早漂移,而这次漂移的代价恰恰是「一处记得图、另一处忘了」。

占位口径:[图: 屏幕截图 2026-10-19 072000.png image/png 1543x983]。有名字用名字,没名字退 mediaType,什么都没有也要落一个裸 [图] —— 绝不返回空串,返回空串正是要修的那个 bug。宽高留着,因为它是唯一能区分「同一张图的不同版本」的线索。

观测:collectMessages 逐事件数 imageCount(user 的 data.content、assistant 的 data.message.content、子会话 data.inserted[].content 三处),随返回值上浮,写进 llm_audit_logs.metadata.imageCount,四种审计行(skip / 失败 / 成功)都带。没有图时不写这个键,老档位 metadata 逐字节不变。

不做(本批)

不调 vision、不读字节、不落原图。宿主侧其实齐全(attachments.readImage()、supportsAcpImagePrompts() 判 inputModalities),但记忆库已很大,原图档明确不做;描述档(多模态模型出 1 段描述 + attachmentId 溯源)是下一批,需要单独一个 provider 槽,不占蒸馏那个。

验收

  • 新增 test/attachment-text.test.js 9 例:占位非空、三级退化、宽松字符串形状逐字节不变、reasoning 仍被挡、图+文顺序、countImages。
  • 新增 test/image-memory.test.js 4 例端到端:图+文进转录、图-only 现在也会蒸馏、两张图数出 2、无图不写 imageCount。
  • 变异自证:把 blockToText 的 image 分支改回 return "" → 图-only 那条立刻红(calls.length 0 ≠ 1);恢复后全绿。
  • test/continuity.test.js 的静态 import 锁同步从「恰好一行」改成「恰好两行」:新增一行仍然转红,仍然要人看一眼它是不是纯的(attachment-text.js 不 import 任何东西,所以「门控不调模型」这条约束没被削弱)。
  • 全量 npm test:2915 tests / 2914 pass / 0 fail / 1 skipped;check-sync 96 个文件一致。

Activity

  1. added a commit that references this issue on Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions