问题
发送前的历史修复 fixRequestContents() 对全历史做多趟扫描,且在正常路径上打印日志。
packages/core/src/core/geminiChat.ts:422(在 :325 被 sendMessage/sendMessageStream 无条件调用)
函数内部依次进行:
- 全量扫描收集所有 function call;
- 全量扫描构建
bestResponses 映射;
- 逐 part 查表重建;
- 第二趟重建做孤儿检测;
- 第三趟
finalContents 收尾清理。
每一趟都遍历全部历史消息及其 parts,约 O(n×p),且每次发送都跑。
此外正常路径上存在大量非门控 console.log,例如 :519、:531、:566、:611、:636、:649、:686、:696 —— 即使没有需要修复的内容,这些字符串插值也会执行。
影响
200 条消息、含较多工具调用的历史,每次发送都重复多趟全量扫描;CLI 下这些 console.log 还会经 ConsolePatcher 进入 React 状态,加重渲染压力。
建议
- 在
recordHistory 追加历史时一次性维护 function-call 索引,避免每次发送重建;
- 常见的「历史本就合法」场景用 dirty 标志位 O(1) 跳过整段修复;
- 所有非错误日志放到
config.getDebugMode() 之后(仓库其他地方已有此模式)。
本 issue 来自对 opensource 分支的一次代码审计(共 8 条,按严重程度拆分),结论均含 文件:行号 出处,欢迎指正。
问题
发送前的历史修复
fixRequestContents()对全历史做多趟扫描,且在正常路径上打印日志。packages/core/src/core/geminiChat.ts:422(在:325被sendMessage/sendMessageStream无条件调用)函数内部依次进行:
bestResponses映射;finalContents收尾清理。每一趟都遍历全部历史消息及其 parts,约 O(n×p),且每次发送都跑。
此外正常路径上存在大量非门控
console.log,例如:519、:531、:566、:611、:636、:649、:686、:696—— 即使没有需要修复的内容,这些字符串插值也会执行。影响
200 条消息、含较多工具调用的历史,每次发送都重复多趟全量扫描;CLI 下这些
console.log还会经ConsolePatcher进入 React 状态,加重渲染压力。建议
recordHistory追加历史时一次性维护 function-call 索引,避免每次发送重建;config.getDebugMode()之后(仓库其他地方已有此模式)。