从 Python 路由接收 JavaScript 中的生成器流对象时出现问题(415 不支持的媒体类型错误)

Problem with receiving a generator stream object in JavaScript from Python route (415 unsupported media type error)

提问人:chris_conrad 提问时间:11/13/2023 更新时间:11/13/2023 访问量:26

问:

我是在 Python?flask 中处理生成器对象的新手,并且在将响应从 Flask 服务器流式传输到 Javascript 前端时遇到了以下问题。

我定义了一个如下所示的 Flask 路由,它从 OpenAI 模型获取响应并以令牌流的形式生成结果。 此路由由按钮单击(POST 请求)触发。这效果很好,我可以看到令牌出现在 Pyhon 控制台中。

@app.route('/send-to-chat', methods=['POST', 'GET'])
def send_chat():
    global index

    data = request.get_json()
    text_input = data['text']
    context = data['ctx']
    lang = data['lang']
    vname = data['vname']
    vemail = data['vemail']
    words = data['words']

    response = get_chat_response(text_input, context, index, lang, vname,vemail, words)

    def generate():
        responseFull = ''

        for word in response:
            data = "data:"+word+"\n\n"
            #print(data)
            yield data


    return Response(stream_with_context(generate()),content_type='text/event-stream')

然后我想在 JavaScript 客户端中接收此流数据。为了实现这一点,我使用了以下代码片段:

var eventSource;

function startEventSource(user, code, previousText) {

  wordContainer = document.getElementById('chatbox');

  eventSource = new EventSource("/send-to-chat");

  eventSource.onopen = function(event) {
    console.log("Connection established.");
  };

  eventSource.onerror = function(event) {
    if (event.target.readyState === EventSource.CLOSED) {
      console.log("Connection closed with error. Attempting to reconnect...", event);
      // Attempt to reconnect after a delay.
      setTimeout(startEventSource, 5000);
    } else {
      console.error("Error occurred:", event);
    }
  };

  eventSource.onmessage = function(event) {
    console.log(event.data);
    wordContainer.innerHTML = previousText+'<br><br>'+event.data;
  };
}

但是,我总是收到 415 错误(不支持媒体类型),并且连接会自动关闭。 我怀疑我需要对路由中的 POST(聊天触发器)和 GET 方法(事件流)做出不同的响应,但我就是找不到合适的方法来做到这一点。任何建议将不胜感激!谢谢!

javascript python 烧瓶 生成器 openai-api

评论


答: 暂无答案