快速结论:这个报错通常出现在使用 LlamaIndex ContextChatEngine、CondenseQuestionChatEngine 或 CondensePlusContextChatEngine 进行流式对话时:调用 astream_chat() 或 stream_chat() 后,异步/同步生成器只产出 1 个完整响应块,而不是逐 token 流式返回。优先排查 LlamaIndex 版本是否落在 >= 0.14.0 且 < 0.14.25 区间。
适用环境:Issue 中确认的工具为 LlamaIndex(llama-index);涉及 Python 异步代码与 llama_index.embeddings.openai.OpenAIEmbedding;触发版本为 >= 0.14.0,已在 0.14.25 修复。Issue 未明确给出操作系统、CUDA、显卡或具体 Python 版本。
最快修复方案:升级到 llama-index == 0.14.25 或更高版本。Issue 摘要明确说明 FIxed in 0.14.25,根因修复由 PR #22788 合入。
注意事项:若暂时无法升级,只能继续停留在 0.13.6 或等待/回移对应修复;Issue 中未给出其他已验证的临时绕过写法。另外,结构化输出(output_cls 不为 None)的合成器仍保持“收集完再一次性产出”的既有契约,不应误认为结构化输出也应逐 token 流式返回。
问题场景
用户在 LlamaIndex 中使用 ContextChatEngine(或 CondenseQuestionChatEngine、CondensePlusContextChatEngine)并调用流式接口 astream_chat() / stream_chat() 时,期望通过 response.async_response_gen() 逐 token 拿到输出。实际表现为:底层 llm.astream_chat(...) 仍然在流式产出,但上层只收到一个完整响应块。回退到 llama-index == 0.13.6 时,流式正常,循环计数通常在 10–100 量级;升级到 >= 0.14.0 后,循环计数变成 1。
报错原文
[Bug]: Streaming responses broken since 0.14.0 for ContextChatEngine and similar classes
## Looped over 1
原因分析
根因定位在 v0.14.0 的 refine 重构,集中在 response_synthesizers/refine.py;对比 v0.13.6,context.py、types.py、base.py、schema.py 没有变化。
DefaultRefineProgram.astream_call/stream_call的非结构化分支(output_cls=None,正是这三个 chat engine 使用的分支)会把 LLM 的每一个 token 累积到本地answer,待流结束后只 yield 一个StructuredRefineResponse。- 随后
_aupdate_response/_update_response把这个单元素生成器交给_get_attribute_from_object_async_generator,后者将其耗尽并在最后只 yield 一次。
因此即使 llm.astream_chat(...) 仍在流式返回,合成器之上的所有调用方只能拿到一个块。在 v0.13.6 中,_arefine_response_single 会把 LLM 流直接透传,这就是旧版本流式正常的原因。
环境排查
- 确认
llama-index版本:问题触发区间为>= 0.14.0,修复版本为0.14.25。 - 确认是否使用
ContextChatEngine、CondenseQuestionChatEngine或CondensePlusContextChatEngine。 - 确认调用的是流式接口(
astream_chat/stream_chat)以及response.async_response_gen()的使用方式。 - 确认是否涉及结构化输出(
output_cls);本次回归仅影响非结构化分支。 - Issue 未提供操作系统、Python、CUDA、PyTorch、显卡等环境信息,这些项无需作为排查重点。
解决步骤
- 查看当前 LlamaIndex 版本,确认是否处于
>= 0.14.0且低于0.14.25。若不在该区间,本 Issue 的结论大概率不适用。 - 将
llama-index升级到0.14.25或更高版本。该修复由 PR #22788 合入,核心改动是: - 让非结构化 default program 在 token 到达时直接 yield 原始 delta;
- 让
_update_response/_aupdate_response原样透传该生成器; - 结构化 program 保持原有“先排空、再一次性 yield”的契约不变。
- 如果必须停留在受影响版本,可优先尝试回退到
0.13.6作为临时规避;注意这只是版本回退,并非 Issue 中验证过的修复路径。 - 注意测试侧的回归:Issue 提到 chat-engine 测试曾固定了该回归行为(
assert num_iters == 1),修复后已改为要求增量交付。如果本地有类似断言,需要同步更新。
验证方法
使用 Issue 提供的复现脚本运行:调用 await chat_engine.astream_chat("what is in the document?"),再用 async for token in response.async_response_gen() 统计 token 数。若输出恢复逐 token 打印、且 ## Looped over 的数量回到 10–100 量级(而非 1),说明流式已恢复。也可直接断言循环次数大于 1,或观察打印内容是否在响应完成前逐步出现。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


