From d0f0f6b8cc9548cbb40fd19932bfafe138ddbb79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?th=E1=BB=8Bnh?= Date: Fri, 10 Jan 2025 13:57:30 +0700 Subject: [PATCH] Fix chat stream response on multiline content json --- app/lib/backend/http/api/messages.dart | 6 +++--- backend/routers/chat.py | 4 +++- backend/utils/chat.py | 7 +++++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/lib/backend/http/api/messages.dart b/app/lib/backend/http/api/messages.dart index 74f586a8ac..0a8674956e 100644 --- a/app/lib/backend/http/api/messages.dart +++ b/app/lib/backend/http/api/messages.dart @@ -114,7 +114,7 @@ Stream sendMessageStreamServer(String text, {String? appId}) } if (line.startsWith('done: ')) { - var text = line.substring(6); + var text = utf8.decode(base64.decode(line.substring(6))); debugPrint(text); yield ServerMessageChunk(messageId, text, MessageChunkType.done, message: ServerMessage.fromJson(json.decode(text))); @@ -177,14 +177,14 @@ Stream sendVoiceMessageStreamServer(List files) async* } if (line.startsWith('done: ')) { - var text = line.substring(6); + var text = utf8.decode(base64.decode(line.substring(6))); yield ServerMessageChunk(messageId, text, MessageChunkType.done, message: ServerMessage.fromJson(json.decode(text))); continue; } if (line.startsWith('message: ')) { - var text = line.substring(9); + var text = utf8.decode(base64.decode(line.substring(9))); yield ServerMessageChunk(messageId, text, MessageChunkType.message, message: ServerMessage.fromJson(json.decode(text))); continue; diff --git a/backend/routers/chat.py b/backend/routers/chat.py index 1978f8eb03..f22fa9b03a 100644 --- a/backend/routers/chat.py +++ b/backend/routers/chat.py @@ -1,6 +1,7 @@ import uuid import re import json +import base64 from datetime import datetime, timezone from typing import List, Optional @@ -106,7 +107,8 @@ async def generate_stream(): ai_message_dict = ai_message.dict() response_message = ResponseMessage(**ai_message_dict) response_message.ask_for_nps = ask_for_nps - yield f"done: {response_message.model_dump_json()}\n\n" + data = base64.b64encode(bytes(response_message.model_dump_json(), 'utf-8')).decode('utf-8') + yield f"done: {data}\n\n" return StreamingResponse( generate_stream(), diff --git a/backend/utils/chat.py b/backend/utils/chat.py index 0e03b21b7c..cc3b33301e 100644 --- a/backend/utils/chat.py +++ b/backend/utils/chat.py @@ -1,5 +1,6 @@ import threading import time +import base64 import uuid from datetime import datetime, timezone from typing import List, AsyncGenerator @@ -111,7 +112,8 @@ def delete_file(): chat_db.add_message(uid, message.dict()) # stream - yield f"message: {message.model_dump_json()}\n\n" + mdata = base64.b64encode(bytes(message.model_dump_json(), 'utf-8')).decode('utf-8') + yield f"message: {mdata}\n\n" # not support plugin plugin = None @@ -162,7 +164,8 @@ def process_message(response: str, callback_data: dict): ai_message_dict = ai_message.dict() response_message = ResponseMessage(**ai_message_dict) response_message.ask_for_nps = ask_for_nps - yield f"done: {response_message.model_dump_json()}\n\n" + data = base64.b64encode(bytes(response_message.model_dump_json(), 'utf-8')).decode('utf-8') + yield f"done: {data}\n\n" # send notification token = notification_db.get_token_only(uid)