GitHub Repo
LangChain 社群回報串流回退缺陷,結構化輸出可能靜默消失
特定模型透過串流介面退回一般呼叫後,工具解析器可能收不到既有資料,且不拋出例外。社群已提供最小重現程式與修補方向,完整影響範圍仍待確認。

2026 年 9 月 27 日,LangChain 社群回報一項結構化輸出缺陷:模型透過串流介面退回一般呼叫後,已生成的工具資料可能未被解析,下游因此收不到結果,過程也不拋出例外。回報環境使用 langchain-core 1.6.5,目前議題仍開啟。[社群回報](https://github.com/langchain-ai/langchain/issues/40858)
重現程式不需連接外部模型,只用自訂模型回傳包含姓名與年齡的工具呼叫,再接上 Pydantic 工具解析器。相同輸入透過 `invoke` 可取得人物物件,改用 `stream` 或非同步 `astream`,收集結果卻都是空陣列。這讓問題能與模型生成品質、網路故障分開檢查。[重現程式與結果](https://github.com/langchain-ai/langchain/issues/40858)
官方文件說明,模型未實作原生串流時,串流介面可回退至一般呼叫;設定 `disable_streaming=True` 也會停用串流。若設為 `"tool_calling"`,觸發條件是請求帶有 `tools` 參數,並非等到模型實際產生工具呼叫才切換。這種相容機制讓應用沿用同一介面,但後續解析仍須保留訊息型別。[官方 API 文件](https://reference.langchain.com/python/langchain-core/language_models/chat_models/BaseChatModel)
比對原始碼可見,累積式解析器會把完整訊息包成通用的 `BaseMessageChunk`。工具解析器卻先判斷它是否屬於 `AIMessage`,才讀取標準工具欄位;若型別不符,就改查舊式附加欄位,找不到便回傳空結果。依此程式路徑推論,核心問題是轉換後未走到正確的資料讀取分支,不能只憑表面現象認定模型沒有回應。[訊息轉換實作](https://github.com/langchain-ai/langchain/blob/master/libs/core/langchain_core/output_parsers/transform.py)、[工具解析實作](https://github.com/langchain-ai/langchain/blob/master/libs/core/langchain_core/output_parsers/openai_tools.py)
對以工具呼叫承載表單、資訊抽取或代理中間結果的系統,這類靜默失敗可能讓下游把解析失敗誤判為「沒有資料」。工程團隊宜用固定回應,比對一般、同步串流及非同步串流三條路徑,並檢查結果數量與必要欄位,避免僅以沒有例外作為成功條件。
回報者提出按原訊息型別轉成對應區塊的修補方向,但截至查核,議題未連結修補 PR,也未見維護者確認完整影響範圍。目前證據不能推廣為所有模型供應商或所有結構化輸出方法皆受影響。暫時採用一般呼叫可作為此案例的排查方式,實際服務仍須驗證。後續應追蹤正式修補與回歸測試,尤其是停用工具串流時,結構化結果是否仍能完整送達。[議題狀態與修補提議](https://github.com/langchain-ai/langchain/issues/40858)