Fireworks: reasoning_content is missing

该报错发生在使用 langchain-fireworks 调用支持思考链的模型(如 GLM-4.6、Kimi K2)时,Fireworks API 返回的 reasoning_content 字段没有被 LangChain 集成层正确捕获或转发。优先检查你是否使用了旧版 langchain-fire

快速结论:该报错发生在使用 langchain-fireworks 调用支持思考链的模型(如 GLM-4.6、Kimi K2)时,Fireworks API 返回的 reasoning_content 字段没有被 LangChain 集成层正确捕获或转发。优先检查你是否使用了旧版 langchain-fireworks(0.3.x),并确认当前版本是否已包含 #34343 的修复。

适用环境:Python 3.12;langchain==0.3.27;langchain-fireworks==0.3.0(触发版本),后续涉及 langchain-fireworks 1.6.0 仍存在缺陷;Fireworks Serverless 上的 kimi-k3、qwen3p8-max、deepseek-v4-pro 等思考模型。

最快修复方案:暂无确认的一步修复方案。Issue 中 #34343 修复了非流式入站转换器,但流式入站和出站(多轮对话)路径在 1.6.0 中仍存在问题。若为紧急情况,可优先尝试评论中提供的 monkey-patch 补丁,但这只是临时方案。

注意事项:monkey-patch 方案已被评论者验证可解决问题,但属于临时绕过手段,升级 langchain-fireworks 版本后可能失效或与官方修复冲突。Issue 中提到的 PR #39909 尚未合并,需等待官方发布包含完整修复的版本。

问题场景

用户在 LangChain 中使用 ChatFireworks 调用支持思维链输出的思考模型(如 Fireworks 托管的 GLM-4.6),并通过 bind_tools 绑定工具后触发调用。代码尝试从响应的 additional_kwargs['reasoning_content'] 读取思考内容,但该字段从未被填充,导致断言失败。深层问题表现为两个函数缺陷:_convert_chunk_to_message_chunk 在流式传输时丢弃了 reasoning_content,以及 _convert_message_to_dict 在多轮对话回传时未将 reasoning_content 转发给 API。

报错原文

Fireworks: reasoning_content is missing

assert response.additional_kwargs['reasoning_content'] # fails
KeyError: 'reasoning_content'

# 流式调用时(1.6.0 版本仍复现)
assert "".join(reasoning_parts)  # ❌ fails — empty

原因分析

可能原因如下:

LangChain Fireworks 集成层在转换 Fireworks API 响应时遗漏了 reasoning_content 字段。具体涉及两个方向:

1. 入站转换_convert_chunk_to_message_chunk 在处理流式 delta 时只提取 content,忽略思考模型返回的 reasoning_content,导致 AIMessageChunk.additional_kwargs 永远不包含该字段。

2. 出站转换_convert_message_to_dict 在将消息回传给 API 时,仅从 additional_kwargs 转发 function_calltool_callsreasoning_content 被静默丢弃。这会导致多轮对话中模型丢失前一轮的思维链。评论者报告在一个 72K token 的长对话中,Kimi K2 在成功工具调用后出现幻觉,复述早前内容而非总结工具结果,保留 reasoning_content 的往返可解决此问题。

该问题并非 Fireworks API 的问题,API 正确返回了 reasoning_content,缺陷在 LangChain 转换器代码中。

环境排查

  • 确认 langchain-fireworks 版本:0.3.0 触发原问题;1.6.0 仅修复非流式入站,流式与出站仍存在缺陷。
  • 确认 langchain 核心版本是否为 0.3.27 或更高(建议升级到最新稳定版再复测)。
  • 确认 Python 版本(报告为 3.12)。
  • 确认调用的模型是否属于思考模型(如 fireworks/glm-4p6、accounts/fireworks/models/kimi-k3、qwen3p8-max、deepseek-v4-pro),Fireworks Serverless 可返回 reasoning_content
  • 检查 chat_models.py_convert_chunk_to_message_chunk(约 L158)和 _convert_message_to_dict(约 L256)的实现是否包含 reasoning_content 处理。

解决步骤

  1. 升级 langchain-fireworks 至包含修复的版本:Issue 中 #34343 已经处理了非流式入站转换器的问题,应先升级到包含该 PR 的版本(原报告 0.3.0 → 1.6.0 已验证非流式场景修复,观察 llm.invoke() 是否能返回 reasoning_content)。
  2. 使用 monkey-patch 作为临时绕过:在初始化 ChatFireworks 前,按评论中给出的补丁,替换 _convert_message_to_dict_convert_chunk_to_message_chunk 两个函数,分别处理出站和流式入站的字段转发。补丁仅适用于紧急情况,升级后应及时移除。
  3. 关注 PR #39909 的合并进度:该 PR 只修改上述两个转换函数并附带 6 个单元测试,是官方建议的修复方向,尚未合并。如果问题阻塞生产环境,可在 GitHub Issue 中留言推动维护者审查。
  4. 参考 langchain-openai 处理方式:Issue 中指出 langchain-openai 对 DeepSeek/o1 模型已有类似处理模式,可对比其实现确认预期行为。

验证方法

运行以下两类测试确认问题已解决:

1. 非流式调用:使用 llm.invoke("What is 17 * 23?"),断言 msg.additional_kwargs.get("reasoning_content") 不为空。

2. 流式调用:遍历 llm.stream("What is 17 * 23?") 返回的 chunk,拼接 chunk.additional_kwargs.get("reasoning_content"),确认最终字符串非空。

3. 多轮回传验证:构造包含 reasoning_content 的聊天历史并再次调用 API,确认出站请求体中包含 reasoning_content 字段(可通过 API 日志或拦截请求验证)。

参考来源

langchain-ai/langchain #34342

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20373

发表回复

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