支持图片压缩,参考billion-context的对图片支持原理 大概是图片不进入压缩,但是会dump到一个文件,使用的时候模型自己重新read
Activity
ranxianglei commentedon Oct 15, 2026
[bot] 🏷 查重:不重复(issue/PR 全量检索「图片 / image / attachment / billion-context」均无既有条目)。
按功能类流程先给评估结论,方向确认后开工。已核实两侧代码:
现状(opencode-acp 侧,已验证)
FilePart({type:"file", mime:"image/*", url:"data:…"})随消息进入 transform hook;lib/token-utils.ts只统计 text / tool / reasoning —— 图片对 ACP 的 token 账本完全不可见;decompress还原原消息(含 FilePart),但依赖 OpenCode 存储还留着原消息;一旦原生 compaction / 消息被删,图片永久丢失。billion-context 的实际原理(读源码确认)
参考实现是
billion-context/src/image-restore.ts(#1995/#2607/#2640),机制是:<stateDir>/retrieve/img/<sessionId>/mNNNNN[-i]-<内容hash8>.<ext>(0600,skip-if-exists;文件名带内容哈希盐防 ref 复用串号);注:内核里的
image-compress.ts(#353,到达时降采样 +image_full恢复工具)是另一个特性(有损降采样),不是本 issue 要的东西。方案对比
推荐 B:owner 说「参考 billion-context 的原理」,BC 当前的生产原理就是 B(fold + archive + file-first);A 的「永不压缩」会让马拉松会话里几十张截图变成永久常驻区,和这个项目的亚线性驻留设计直接冲突。B 同样满足「图片不进入压缩」的本意——像素从不被有损摘要,只被无损归档。
v1 范围(不含「老图提前卸载」——把还没折叠的老图主动换成指针省 token:UX 风险是模型任务中途失去直接视图,且 BC 在滑动窗口变体上踩过缓存坑;token 释放放在折叠时刻,与今天静默丢失的时刻相同,严格更优。如需要可做 v2 配置开关)。
结构化八问(决策请求)
lib/token-utils.ts)、折叠直接丢弃、摘要生成没有引用图片的通道。BC 已用「落盘存档 + file-first 恢复」解决同一问题,opencode-acp 未移植。storage/plugin/acp/images/<sessionSafe>/mNNNNN[-i]-<sha8>.<ext>(0600、skip-if-exists、内容哈希盐命名);② 折叠完成时若 range 含已存档图,向块摘要的 protected-content 附录追加指针行[Archived image: m00042 (png, 1.2MB) → <绝对路径> — use read tool to view];③ state 只记元数据+路径,compaction reset 时清空(ref 会重发号);④ TTL 清理。不加新工具——模型用自己的 read 重读(OpenCode read 支持图片输入),即「使用的时候模型自己重新 read」。lib/compress/image-archive.ts),不动既有数据流;SessionState 加可选字段;存储加images/子树。compress.images:enabled(默认 true,false = 行为与现状逐字节一致)、minBytes(默认 16384,小图不落盘避免垃圾文件)、ttlDays(默认 7)。无需迁移。待拍板
enabled=true(推荐,纯增量)还是保守 off-by-default?确认后交付:分支 + devlog(REQ/WORKLOG/DESIGN,涉及新模块与存储布局需 DESIGN)+ 实现 + 定向测试(命名/幂等/state 合并/折叠注入/disabled 零差异电池)+ 双 agent review + PR。远端 http(s) URL 图片与非 image mime 不在 v1 范围(DESIGN 中注明)。
ranxianglei commentedon Oct 15, 2026
B 开搞
ranxianglei commentedon Oct 15, 2026
已完成,PR: #479 (Closes #478,等 CI 与双 agent review)
按 B 方案实现:图片不进摘要、落盘成文件、模型自己重读。
八问
FilePart只活在原消息里;折叠用块摘要替换原消息,整条管线没有任何环节为图片留痕。文本靠摘要存活,图片没有等价物。assignMessageRefs后把符合条件的图片(data URL、二进制 mime、≥minBytes)解码写到<storageDir>/images/<dirName(sessionId)>/(0600,文件名含内容哈希,skip-if-exists 安全);② 折叠时摘要链最后一步追加指针附录- m00042: /abs/path.png (image/png, 24576 bytes),模型用自己的文件工具重读;③ TTL 清扫(默认 7 天)每进程每会话一次,best-effort。不加新工具、不动 system prompt。compress.images { enabled=true, minBytes=16384, ttlDays=7 },仅顶层compress节点(不参与按模型级联——归档位置是会话级的)。无需迁移,默认值开箱生效;enabled:false完全回退旧行为。行为变更披露:默认开启后,含归档图片的折叠块摘要会比以前多几行路径附录;磁盘新增
images/目录(TTL 自动清理)。测试:新增
tests/image-archive.test.ts8 例(落盘权限/去重/skip 矩阵/TTL 语义/指针渲染)。devlog REQ+WORKLOG+DESIGN 齐备,check-pr.sh通过。ranxianglei commentedon Oct 15, 2026
CI 全绿:pr-validation / build / test(22) / test(24) / build-artifact / e2e 全部 success。PR #479 可以进入双 agent review → 人工合并流程。
fix: keep compress.images out of cascade blanket-apply (#478)
Merge pull request #479 from ranxianglei/2026-10-15_image-archive
release: v1.18.4 — changelog + devlog for image archive (#478/#479)
Merge branch 'master' into 2026-09-16_serialize-session-init-transforms