在本次 DEV 夏季 Bug Smash 中,我们修复了 Sentry JavaScript SDK 对 Google GenAI 自动埋点的一个静默回归。此前,每一次 Gemini 调用都会在追踪中显示为一个 span,并附带模型、生成配置和系统指令。但一次重构之后,聊天调用的配置信息被悄悄丢弃,导致追踪不再反映模型是如何设置的。
该问题由 Sentry 维护者报告为 getsentry/sentry-javascript#20086。根因在于 Google GenAI SDK 将聊天拆成两步:首先通过 chats.create({ model, config }) 在本地创建聊天对象,这一步骤并不会真正调用模型,但会保存 temperature、top_p、top_k、max_tokens、惩罚项、工具列表和系统指令等配置;随后 chat.sendMessage() 和 chat.sendMessageStream() 才会真正调用模型,并复用创建时的配置。
Sentry 此前会为 chats.create() 生成一个 span,并从中读取配置。重构 #19990 正确地移除了这个 span,因为它不是真正的模型调用,但同时也让配置失去了来源。此后,消息 span 只能看到每次调用传入的文本,导致 gen_ai.request.temperature、top_p、top_k、max_tokens、惩罚项、available_tools 和 gen_ai.system_instructions 从追踪中彻底消失。实际上,该 PR 的描述中已经预见到了这个风险,并将其列为后续任务,正是这次的问题。
根本原因在于:用于给客户端加埋点的深层代理会重新代理 chats.create() 返回的聊天对象,但在代理过程中丢弃了创建调用时的参数,因此构造消息 span 的代码永远看不到这些配置。
修复方案是 PR #23316,它在 @sentry/server-utils 中做了一个聚焦的改动,并附带单元测试。我还针对真实 Gemini API 进行了端到端验证,确认配置信息已经重新出现在追踪中,7 项关键参数不再丢失。
热门跟贴