fix: 修复流式聊天的问题

This commit is contained in:
ViperEkura 2026-03-24 15:18:56 +08:00
parent fb66af9154
commit 8d259e2d50
1 changed files with 18 additions and 9 deletions

View File

@ -3,7 +3,7 @@ import json
import os import os
import requests import requests
from datetime import datetime from datetime import datetime
from flask import request, jsonify, Response, Blueprint from flask import request, jsonify, Response, Blueprint, current_app
from . import db from . import db
from .models import Conversation, Message, User from .models import Conversation, Message, User
from . import load_config from . import load_config
@ -217,6 +217,9 @@ def _sync_response(conv):
def _stream_response(conv): def _stream_response(conv):
conv_id = conv.id
app = current_app._get_current_object()
def generate(): def generate():
full_content = "" full_content = ""
full_thinking = "" full_thinking = ""
@ -224,8 +227,11 @@ def _stream_response(conv):
msg_id = str(uuid.uuid4()) msg_id = str(uuid.uuid4())
try: try:
resp = _call_glm(conv, stream=True) with app.app_context():
resp.raise_for_status() active_conv = db.session.get(Conversation, conv_id)
resp = _call_glm(active_conv, stream=True)
resp.raise_for_status()
for line in resp.iter_lines(): for line in resp.iter_lines():
if not line: if not line:
continue continue
@ -255,12 +261,15 @@ def _stream_response(conv):
yield f"event: error\ndata: {json.dumps({'content': str(e)}, ensure_ascii=False)}\n\n" yield f"event: error\ndata: {json.dumps({'content': str(e)}, ensure_ascii=False)}\n\n"
return return
msg = Message( # 流式结束后最后写入数据库
id=msg_id, conversation_id=conv.id, role="assistant", with app.app_context():
content=full_content, token_count=token_count, thinking_content=full_thinking, msg = Message(
) id=msg_id, conversation_id=conv_id, role="assistant",
db.session.add(msg) content=full_content, token_count=token_count, thinking_content=full_thinking,
db.session.commit() )
db.session.add(msg)
db.session.commit()
yield f"event: done\ndata: {json.dumps({'message_id': msg_id, 'token_count': token_count})}\n\n" yield f"event: done\ndata: {json.dumps({'message_id': msg_id, 'token_count': token_count})}\n\n"
return Response(generate(), mimetype="text/event-stream", return Response(generate(), mimetype="text/event-stream",