聊天机器人终端
在前端输入问题时,会向/api/chat端点发送POST 请求。请求正文必须包括用户的问题,格式如下:
{
"question": "the question goes here"
}根据服务器发送事件(SSE)规范的定义,应用程序的响应是一个事件流。服务器返回给客户端的事件顺序如下:
data: [SESSION_ID] session-id-assigned-to-this-chat-sessiondata: [SOURCE] json-formatted-document(对已确定的每个相关文件来源重复)。data: response chunk(对 LLM 返回的每个响应块重复)。data: [DONE]
客户可通过在请求 URL 中添加session_id 查询字符串参数,选择提出后续问题。
聊天机器人终端的高级逻辑在文件api/app.py 中 Flask 应用程序的api_chat() 函数中:
@app.route("/api/chat", methods=["POST"])
def api_chat():
request_json = request.get_json()
question = request_json.get("question")
if question is None:
return jsonify({"msg": "Missing question from request JSON"}), 400
session_id = request.args.get("session_id", str(uuid4()))
return Response(ask_question(question, session_id), mimetype="text/event-stream")文件api/chat.py中的ask_question() 函数是一个生成器函数,它使用 Flask 的响应流功能(基于yield 关键字)对上述事件进行流式处理:
@stream_with_context
def ask_question(question, session_id):
yield f"data: {SESSION_ID_TAG} {session_id}\n\n"
# ...
yield f"data: {DONE_TAG}\n\n"