快速结论:该问题出现在 Langfuse Playground 的 Tools 菜单中:当用户从工具下拉菜单打开创建或编辑工具弹窗时,工具列表层没有关闭,仍然停留在弹窗下方或覆盖在弹窗上,属于 UI 层的弹层生命周期问题,因此应优先检查下拉菜单与弹窗的开合状态是否联动。
适用环境:自托管(Self-hosted)Langfuse,运行 main 分支 commit 95933f73a;Issue 标注为 UI only,SDK 与集成版本为 N/A,未提供操作系统、Python、CUDA、显卡等环境信息。
最快修复方案:暂无确认的一步修复方案。Issue 讨论给出的方向是:由代码接管 Tools Popover 的 open 状态,在弹窗打开前或打开时先关闭 Popover,并把 CreateOrEditLLMToolDialog 改为渲染在 PopoverContent 的同级,而不是嵌套其内部。
注意事项:上述方案来自 Issue 中维护方机器人分析以及相关 PR 的修复模式,并非本 Issue 已验证的结论;由于 Radix 在关闭时会卸载下拉菜单或弹窗内容,如果把弹窗仍嵌在 PopoverContent 里,关闭 Popover 时会连带销毁弹窗,因此必须同时调整渲染层级。
问题场景
用户在 Langfuse Playground 顶部工具栏点击 Tools,从下拉菜单中选择 Create new tool,点击已保存工具旁的铅笔(编辑)图标,或点击已附加的工具卡片时,会弹出创建或编辑 LLM 工具的对话框。Issue 描述的现象是:Tools 下拉层不会关闭,工具列表仍然渲染在对话框下方或覆盖在对话框内容上,导致表单难以阅读和操作。
报错原文
bug: playground tools dropdown stays open behind the create/edit tool dialog
原因分析
根据 Issue 讨论,可能原因如下:CreateOrEditLLMToolDialog 被嵌套渲染在 Tools Popover 的内容内部。DialogTrigger 和对话框自身的 open 状态都在工作,但弹窗打开时没有任何逻辑去关闭父级 Popover,于是 Popover 继续挂载在对话框遮罩层下方。Issue 将同类问题定性为弹层生命周期问题,而非 z-index 层级问题。
环境排查
- 确认 Langfuse 版本:Issue 中为自托管 main 分支 commit
95933f73a,可对照自身版本是否包含相关修复。 - 确认问题路径:Playground 的 Tools 下拉菜单,以及创建、编辑工具和工具卡片三种入口是否都能复现。
- 确认前端代码结构:
ConfigurationDropdowns.tsx与PlaygroundTools/index.tsx中 Tools Popover 的 open 状态是否受控,CreateOrEditLLMToolDialog是否仍嵌在PopoverContent内部。 - Python、CUDA、PyTorch、显卡、SDK 版本与本问题无直接关系,Issue 已标注 UI only,无需作为排查项。
解决步骤
- 定位 Playground 中 Tools 组件的
Popover,将其 open 状态改为受控,由父组件持有。 - 在打开创建或编辑工具对话框时,先关闭该 Popover,再打开对话框。
- 把
CreateOrEditLLMToolDialog从PopoverContent内部移到其同级位置,避免 Popover 关闭卸载内容时把对话框一起销毁。 - 可优先尝试迁移到已有
PopoverController和DialogController(PR #15893 引入)的写法,使弹层生命周期不再由下拉内容内部持有。 - 参考 PR #14693 中
useAddLlmConnectionSelect协调钩子的模式,作为两个弹层联动的具体实现参考。
验证方法
在 Playground 中依次执行三条复现路径:Tools → Create new tool、点击已保存工具的铅笔图标、点击已附加工具卡片。确认这些操作都能正常打开对话框,同时 Tools 下拉层已关闭,且不再出现在对话框下方或覆盖在对话框上;关闭对话框后再次打开 Tools,菜单应能正常展开。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。

![[Bug]: Proxy keeps upstream LLM connection open after a streaming client disconnects; backend keeps generating or stays blocked](https://www.chat-gpts.plus/wp-content/uploads/2026/10/30244-70d90a5d-768x403.jpg)
![[Bug]: user_config routing discards the Router before the call runs](https://www.chat-gpts.plus/wp-content/uploads/2026/10/43486-47692012-768x403.jpg)