You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+OpenAI集成Flask-SocketIO流式返回异常求助

Flask-SocketIO 结合 OpenAI 流式返回批量发送问题解决方案

核心原因

你的代码无法实时推送流式内容,大概率是以下两个问题导致:

  • 同步阻塞导致 SocketIO 消息被缓冲,无法实时推送
  • OpenAI API 调用未正确开启流式返回

分步解决

1. 确认 OpenAI 流式返回已启用

检查 company_research.get_company_chat 内部调用 OpenAI ChatCompletion API 时,是否明确设置了 stream=True 参数。如果未开启该参数,API 会一次性返回完整结果,自然无法实现流式推送。

2. 切换为异步处理模式

同步处理函数会阻塞事件循环,导致 SocketIO 无法实时发送消息。将处理函数改为异步,并使用 await 调用 socketio.send:

@socketio.on("chat", namespace=namespace)
async def company_chat(data: list):
    print(f"I'm in function: {inspect.currentframe().f_code.co_name}")
    try:
        request_json = RequestCompanyChat(**data)
        results = company_research.get_company_chat(
            request_json.locale, request_json.company_name, 
            request_json.messages
        )
        for chunk in results:
            content = chunk.choices[0].delta.content or ""
            await socketio.send(
                ResponseCompanySearch(content=content).model_dump_json(),
                namespace=namespace,
                to=request.sid,
            )
            print(content, end="")
            # 强制触发上下文切换,确保消息实时推送
            await socketio.sleep(0)
        await socketio.send("end", namespace=namespace, to=request.sid)
    except Exception as e:
        print(e)
        import traceback
        traceback.print_exc()
        await socketio.send(f"An error occurred: {str(e)}", namespace=namespace)

3. 配置异步服务器

确保 Flask-SocketIO 使用异步服务器(如 eventlet)启动,否则异步函数无法正常运行:

from flask import Flask
from flask_socketio import SocketIO
import eventlet

eventlet.monkey_patch()
app = Flask(__name__)
socketio = SocketIO(app, async_mode='eventlet')

# 后续路由和事件注册...

if __name__ == '__main__':
    socketio.run(app, debug=True)

4. 同步模式下的临时修复

如果暂时无法切换异步,可在每次 socketio.send 后添加 socketio.sleep(0),强制释放事件循环,让消息实时推送:

# 同步函数中的循环部分
for chunk in results:
    content = chunk.choices[0].delta.content or ""
    socketio.send(
        ResponseCompanySearch(content=content).model_dump_json(),
        namespace=namespace,
        to=request.sid,
    )
    print(content, end="")
    # 触发上下文切换
    socketio.sleep(0)

额外检查

  • 客户端需确保实时处理收到的 SocketIO 消息,避免在客户端缓存消息后一次性渲染
  • 确认网络环境无延迟或代理导致的消息堆积

内容的提问来源于stack exchange,提问作者An-Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:16:22