问题
遥测日志每轮都把完整响应 / 全部 chunk 序列化成 JSON,仅仅是为了传给 _logApiResponse / _logApiRequest。
- 非流式:
packages/core/src/core/geminiChat.ts:370
await this._logApiResponse(durationMs, prompt_id, response.usageMetadata, JSON.stringify(response), ...);
- 流式:
packages/core/src/core/geminiChat.ts:981
await this._logApiResponse(durationMs, prompt_id, this.getFinalUsageMetadata(chunks), JSON.stringify(chunks), ...);
- 请求侧
_getRequestTextFromContents 也对整段 contents(完整 curated 历史 + 本轮输入)做 JSON.stringify(geminiChat.ts:~174)。
流式响应里 chunks 可能累积上百个 chunk 对象,JSON.stringify(chunks) 的体量是整个响应大小级别,且同步发生在「chunk 结束 → 记录历史」之间。
影响
响应越大、流式 chunk 越多,序列化开销越高(O(响应大小)),卡在热路径上。
建议
遥测只记录轻量摘要(模型名、token 数、首/尾 part 文本),而不是序列化完整对象;必要时采样或截断。
本 issue 来自对 opensource 分支的一次代码审计(共 8 条,按严重程度拆分),结论均含 文件:行号 出处,欢迎指正。
问题
遥测日志每轮都把完整响应 / 全部 chunk 序列化成 JSON,仅仅是为了传给
_logApiResponse/_logApiRequest。packages/core/src/core/geminiChat.ts:370packages/core/src/core/geminiChat.ts:981_getRequestTextFromContents也对整段 contents(完整 curated 历史 + 本轮输入)做JSON.stringify(geminiChat.ts:~174)。流式响应里
chunks可能累积上百个 chunk 对象,JSON.stringify(chunks)的体量是整个响应大小级别,且同步发生在「chunk 结束 → 记录历史」之间。影响
响应越大、流式 chunk 越多,序列化开销越高(O(响应大小)),卡在热路径上。
建议
遥测只记录轻量摘要(模型名、token 数、首/尾 part 文本),而不是序列化完整对象;必要时采样或截断。