Skip to content

[Bug] Google audio, video and PDF inlineData can be discarded by image shedding #6176

Closed

Description

@Afloat16

Description *

Affected source

Package version 0.1.213, source revision 33104b1f9545caeb0344193009917ceef9969682. This is a source-level regression report for this exact revision.

Problem

The Google collector treats every inlineData part as an image. Gemini also carries audio, video and documents in that field, so a byte or image-count limit can replace those parts with an image-omitted note. Undeclared media is likewise assumed to be PNG without evidence.

Proposed correction

Collect Google inlineData only when its declared MIME type is image/*. Preserve non-image and unknown media in both byte and count shedding; image archiving and protected-tail behavior continue as before.

Google's Part/Blob schema documents these non-image media types: https://ai.google.dev/api/generate-content#Blob

Regression coverage

The prepared branch includes focused regression coverage in tests/egress-shed-media.test.ts, tests/issue4124-image-count-cap.test.ts, tests/issue5745-image-shed-cap.test.ts.

Category N (server-side media handling).

Suggested triage labels: p1, scope/wiring.

bili version *

0.1.213 — source revision 33104b1

Usage mode *

Launcher (bili pi / bili codex / bili dsh / bili kimi …)

Client and version *

Direct Node.js v24.22.1 regression harness; no external agent client session.

Operating system *

Linux x86_64; deterministic local regression fixtures.

Upstream and model *

No live upstream/model request; deterministic source-level regression fixtures.

Compression-related config (optional)

Log excerpt (strongly recommended)


/acp or acp_status output (optional)


Activity

  1. Afloat16 commented on Nov 11, 2026

    @Afloat16
    ContributorAuthor

    Proposed fix: #6184. The collector now limits image shedding to declared image/* media and retains audio, video, PDF and unknown media. The independent focused suite passes 30/30.

  2. ranxianglei commented on Nov 11, 2026

    @ranxianglei
    Owner

    🤖 Powered by ework · qwen3.8-27b

    [bot] (ai: qwen/qwen3.8-27b)

    查重:不重复。本报告与上游同号内容 #6176 是同一份(标题/作者/时间戳一致,PR #6184 正文写 Fixes #6176 即指本条),且已有修复 PR #6184。未与其它独立缺陷重复。本次为对 #6184 的审核 + 本地定向验证。

    标签:bug · scope/wiring(出站 wire 媒体处理)· p2(能用但特定条件下明显退化,非永久数据丢失)。


    结构化八问

    1. 是什么问题:Gemini 的 inlineData 字段不只装图片——音频、视频、PDF 也走它。但出站 shedding 把每个 inlineData 都当图片:超预算时把非图媒体替换成一张 [image: … omitted] 占位、或从图片计数里算进去再归档,导致模型这一轮看不到用户发的文档/音频。此外没声明 MIME 的媒体被无证据地默认成 PNG。

    2. 什么原因导致的:根因在收集器这一层。src/egress-shed.ts 的 collectOccurrences() google 分支(master 第 170–172 行)对每个 inlineData 无条件收集为「图片 occurrence」,MIME 缺失默认 image/png——把「有 inlineData」等同于「是图片」。字节 shedding(shedWireImages)和计数 shedding(shedWireImagesToCount)都走这一个收集器,所以两条路都被污染。

    3. 影响范围与严重程度:触发条件较窄,须同时满足——走 Google/Gemini 协议 + 请求带非图 inlineData + 触发了字节预算或图片数量上限的 shedding。命中时该轮模型看不到这份媒体(被误标成 image omitted),多模态文档/音频任务会退化甚至答错;原始字节仍在会话存储与客户端自身历史里,不是永久数据丢失。普通文本+图片会话完全不受影响。→ p2(特定条件明显问题,需绕行/命中才发生,未到 p1 数据丢失档)。

    4. 怎么修复的:在收集器源头按 MIME 收口——google 分支只在声明的 mimeType 匹配 ^image\//i 时才收集为图片;非图与未知媒体一律不收集(两条 shedding 路自然都不碰它们)。真图片的归档 / protected-tail / jimp 降采样行为保持不变。这是改「决定什么算图片」的那一层(疏),不是在下游过滤字节(堵)。

    5. 是否有回归问题:

      • 既有 google 用例(tests/issue3400-image-rescale.test.ts:516、tests/issue4124-image-count-cap.test.ts:207)都用显式 image/png MIME,仍被收集 → 不受影响,本地全绿。
      • 行为变更(披露):无/非图 MIME 且原来会被 shed 的 inlineData,现在不再被 shed。旧值=当作 image/png 参与字节/计数 shedding(可能被归档或降采样);新值=原样保留。这是本 PR 的目的本身(修的就是这个误判),也更安全——避免把非图喂给 jimp 降采样造成损坏。代价:若真出现「缺 MIME 的大体积真图」本轮不会被 shed,可能仍超预算并走 send anyway+warn 日志路径;Gemini 规范要求 mimeType 必填,属畸形输入边缘,可接受。
      • Anthropic/OpenAI/responses 分支未动(它们的图片块由构造即确定是图,不存在此歧义)。
    6. 是否破坏缓存:不涉及。shedding 只作用于出站副本,不改内核状态、不改前缀缓存键;本次仅缩小「哪些 part 参与 shed」的集合,不改变任何已缓存字节的生成方式。

    7. 是否改了设计方向:不涉及。仍是同一个两档 shedding 机制,只是把 google 的图片识别从「有 inlineData 即是图」收紧为「声明为 image/* 才是图」。

    8. 是否引入了新的配置:不涉及。无新 env/config/默认值。


    验证证据(本地定向,非全量)

    • 装好依赖 + 构建 kernel 后跑 egress-shed 相关 6 个测试文件共 69 例全绿(含新增 tests/egress-shed-media.test.ts 8 例)。
    • 负向对照:撤掉 src 改动后新增 8 例全红 → 测试确实钉住了原 bug(有牙)。
    • 双向覆盖到位:非图保留 ✓ + 真图仍被 shed(mixed-media 用例)✓。
    • PR [PR] fix: preserve non-image Google inline media during image shedding #6184 CI 正在跑(hermetic 全矩阵),当前 30 项 0 failed / 9 pending,mergeable(behind master,无冲突)。

    一个不阻塞的小提示

    PR 描述里 "Regression coverage" 列了三个测试文件(egress-shed-media / issue4124 / issue5745),实际 diff 只新增 tests/egress-shed-media.test.ts,另两个是既有用例未改动——措辞上易让人以为三个都改了;实质覆盖没问题,不影响合并判定。


    结论:修复正确、最小、覆盖双向,测试有牙,CI 无失败。建议合并(合并权在 owner,我不代 merge)。PR 质量达标,无需在分支上重构。等 CI 全绿后即可合入。

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions