TypeError: string indices must be integers

当 LangChain 流式合并 Mistral 返回的内联引用(reference)内容块时, merge_lists 会在字符串元素上做 "index" in e_left 判断,随后按下标访问字符导致 TypeError: string indices must be integers 。优先

快速结论:当 LangChain 流式合并 Mistral 返回的内联引用(reference)内容块时,merge_lists 会在字符串元素上做 "index" in e_left 判断,随后按下标访问字符导致 TypeError: string indices must be integers。优先排查流式返回中是否混入了 str 与引用字典并存的内容块。

适用环境:Issue 中确认的环境为 Linux、Python 3.11.13、langchain_core 1.2.5、langchain 1.2.0、langchain_mistralai 1.1.1、langgraph 1.0.5,模型为 mistral-medium-2505(开启 streaming)。未提供 CUDA、显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的修复方向是在访问 e_left["index"] 前增加 isinstance(e_left, dict) 判断,可优先尝试;该修复尚处 PR 阶段,未标记为已合并验证。

注意事项:仅做类型判断可避免崩溃,但流式输出中 str 与引用字典混合的类型不一致问题依然存在;Issue 讨论中认为应让 stream 的输出结构对齐 invoke(返回 {"type": "text", "text": "..."} 形式),否则最终结果结构可能仍不符合预期。

问题场景

用户在使用 LangGraph 的 create_react_agent(Mistral 模型 + 例如 Tavily 等可被引用的工具)时开启流式模式,模型返回内联引用(citations)内容。复现代码直接调用了 langchain_core.utils._merge.merge_lists,将包含字符串与 {"type": "reference", ...} 字典的列表与新的引用块合并时触发报错。

报错原文

File ".../langchain_core/utils/_merge.py", line 114, in <listcomp>
      if "index" in e_left and e_left["index"] == e["index"]
                               ~~~~~~~^^^^^^^^^
  TypeError: string indices must be integers, not 'str'

原因分析

可能原因(Issue 维护者给出的根因):merge_lists 中的守卫条件 "index" in e_left 在 e_left 为字符串时执行的是子串包含判断,而非字典键查找。当某个字符串元素恰好包含 "index" 子串时,该判断为真,随后 e_left["index"] 以字符串下标访问,抛出 TypeError。同时,流式返回将 str 与引用字典交织输出,而 invoke 返回的是 list[dict],两者类型结构不一致是该问题的背景成因。

环境排查

  • 确认 langchain_core 与 langchain_mistralai 版本(Issue 环境为 1.2.5 与 1.1.1),核对是否已包含相关修复。
  • 确认是否开启 streaming,以及模型是否配置为返回引用(citations)。
  • 确认模型类型(Issue 使用 mistral-medium-2505,推测其他返回引用的 Mistral 模型同样受影响)。
  • 若使用 create_react_agent,确认 langgraph 版本及工具(如 Tavily)返回结果是否被模型引用。
  • 抓取流式返回的原始内容块,确认是否同时存在 str 与 dict 类型元素。

解决步骤

  1. 先用最简复现确认问题:调用 merge_lists,merged 中包含字符串与 {"type": "reference", "index": 0, "reference_ids": [...]},other 为另一个引用字典,观察是否抛出上述 TypeError。
  2. 检查所用 langchain_core 是否已修复该 merge_lists 的类型判断逻辑;若未修复,可优先尝试在 merge_lists 中为 "index" in e_left 前补充 isinstance(e_left, dict) 守卫(Issue 中提出的修复方向,对应 PR 尚待合并)。
  3. 若目标是获得与 invoke 一致的稳定结构,关注使流式输出采用 {"type": "text", "text": "..."} 形式的改动(Issue 讨论中提出的方向),避免 str 与引用字典混排。
  4. 在本地临时修改后,用 Issue 的最简复现与完整 agent 调用分别验证。

验证方法

重新运行最小复现,确认 merge_lists 不再抛出 TypeError;再运行 agent 的流式调用,确认最终聚合结果与 invoke 的结构一致、引用块被正确合并。

参考来源

langchain-ai/langchain #35259

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34209

发表回复

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