bug(topics): topicProviderGroups injects savedModel into all connections and TopicSetupSession doesn’t fill null slots when adding a second

该报错通常出现在 Langfuse Topics 设置流程中配置多个 LLM 连接(或后续新增 embedding 连接)时:已保存模型会被错误注入到所有 provider 的模型列表,且新增连接后为空的 draft 模型槽位不会自动填充。优先排查 topicProviderGroups 的 sav

快速结论:该报错通常出现在 Langfuse Topics 设置流程中配置多个 LLM 连接(或后续新增 embedding 连接)时:已保存模型会被错误注入到所有 provider 的模型列表,且新增连接后为空的 draft 模型槽位不会自动填充。优先排查 topicProviderGroups 的 savedModel 作用域和 TopicSetupSession 的 key 刷新逻辑。

适用环境:Langfuse Cloud(v4.70.0 Cloud / main),涉及 web/src/features/topics/topic-setup-flow.ts 与 TopicSetupFlowController.tsx。Issue 未提供操作系统、Python、CUDA 或显卡环境信息。

最快修复方案:暂无确认的一步修复方案。Issue 中提到已提交带单元测试的修复 PR #19359,但维护者以功能仍在活跃开发、处于 closed beta 阶段为由关闭了 Issue,未确认合并状态。

注意事项:该 Issue 被标记为 unconfirmed bug 且已关闭,相关结论来自 Issue 描述与作者 PR,不代表官方已修复;功能仍在活跃开发中,行为可能随版本变化。未验证的修复请勿直接视为稳定方案。

问题场景

用户在 Langfuse Topics 设置流程中配置至少两个 LLM 连接,并希望其一使用已保存的自定义模型时,JudgeModelPicker 会把同一个 savedModel 列到所有 provider 的模型组下。用户若在另一个 provider 下选中该模型,提交时会提示模型不属于当前项目连接。另一种场景是:项目已有 1 个仅聊天连接(如 Anthropic,connections.length === 1 且 draft.embedding 初始为 null),用户在另一个标签页新增一个 embedding 连接后返回,draft.embedding 仍为 null,没有自动选择推荐的 embedding 模型。

报错原文

bug(topics): topicProviderGroups injects savedModel into all connections and TopicSetupSession doesn't fill null slots when adding a second connection
"Choose a model from a connection in this project."

原因分析

可能原因有两个:其一,topic-setup-flow.ts 中的 topicProviderGroups(connections, kind, savedModel) 对 connections 中每个连接都调用 topicModelsFor 并传入 savedModel,没有像 ConfigureTopicsDialogController.tsx 那样用 connection.id === storedSlot?.llmApiKeyId 做归属判断,导致 savedModel 被注入到其他 provider 的模型组;当用户在其他 provider 下选中它时,resolveTopicModelSlot 返回 null 并触发上述报错。同时 TopicSetupFlowController.tsx 只传入 settings.stored.summary?.model 给 providerGroups,遗漏了 settings.stored.clustering?.model。其二,TopicSetupSession 的 key 根据 settings.connections.length > 0 在 "ready" 与 "none" 间切换;当连接数从 1 变为 2 时 key 仍为 "ready",组件不会重新挂载,新增连接到达后为空的 draft 模型槽位不会被回填。

环境排查

  • 确认 Langfuse 版本:Issue 报告为 v4.70.0(Cloud / main),请核对当前实例版本。
  • 确认是否为 Langfuse Cloud 还是自托管,自托管需记录实际部署版本。
  • 检查项目中的 LLM 连接数量与类型(chat-only 连接、embedding 连接)。
  • 检查是否存在已保存的 summary 或 clustering 自定义模型,以及其所属 llmApiKeyId。
  • 确认新增连接是在另一个标签页完成,返回后 draft.embedding 是否仍为 null。

解决步骤

  1. 在 topic-setup-flow.ts 中,将 savedModel 的作用域限定到匹配的连接,可优先尝试按 connection.id === storedSlot?.llmApiKeyId 判断后再传给 topicModelsFor,避免注入到其他 provider 的模型组。
  2. 在 TopicSetupFlowController.tsx 中补全传给 providerGroups 的已保存模型来源,可优先尝试同时传入 settings.stored.summary?.model 和 settings.stored.clustering?.model。
  3. 检查 TopicSetupSession 的 key 逻辑:当前仅根据 connections.length > 0 切换;可优先尝试让 key 随连接数量或连接集合变化,使新增连接后组件重新挂载。
  4. 在重新挂载或焦点返回时,为仍为 null 的 draft 模型槽位填充推荐模型(例如新增 embedding 连接后回填 draft.embedding)。
  5. 若需要直接获得修复,可关注或试用 Issue 中提到的 PR #19359,其包含上述两处修复及单元测试;合并状态需另行确认。

验证方法

配置两个 LLM 连接并只在其中一个上保存自定义模型,打开 JudgeModelPicker,确认 savedModel 只出现在其所属 provider 的模型组下;在另一个 provider 下不再可选该模型,提交时也不应出现 “Choose a model from a connection in this project.”。另一项验证:以 1 个 chat-only 连接开始 Topics 设置,在另一标签页新增 embedding 连接后返回,确认组件重新挂载且 draft.embedding 被填充为推荐 embedding 模型,而非保持 null。

参考来源

langfuse/langfuse #19353

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31907

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注