From a47edf16612e48f6070a8fad560848574112310d Mon Sep 17 00:00:00 2001 From: snaily Date: Fri, 9 May 2025 14:11:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E4=BC=AA=E6=B5=81?= =?UTF-8?q?=E5=BC=8F=E4=BC=A0=E8=BE=93=E4=B8=AD=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=9D=97=E5=88=86=E9=9A=94=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交主要修复了在伪流式传输中数据块的分隔符问题,将 `\n\` 修改为 `\n\n`,确保数据块的正确分隔。这一更改提高了数据传输的准确性,避免了潜在的解析错误。相关修改涉及 `OpenAIChatService` 类中的多个方法,确保在发送数据时遵循一致的格式。 --- app/service/chat/openai_chat_service.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/service/chat/openai_chat_service.py b/app/service/chat/openai_chat_service.py index a89102e..8d6fafd 100644 --- a/app/service/chat/openai_chat_service.py +++ b/app/service/chat/openai_chat_service.py @@ -268,7 +268,7 @@ class OpenAIChatService: "model": model, "choices": [{"index": 0, "delta": {}, "finish_reason": None}], } - yield f"data: {json.dumps(empty_chunk)}\n\\n" + yield f"data: {json.dumps(empty_chunk)}\n\n" logger.debug("Sent empty data chunk for fake stream heartbeat.") empty_data_generator = send_empty_data_locally() @@ -323,7 +323,7 @@ class OpenAIChatService: base_chunk_for_text, full_text ) final_chunk["choices"][0]["finish_reason"] = "stop" - yield f"data: {json.dumps(final_chunk)}\n\\n" + yield f"data: {json.dumps(final_chunk)}\n\n" logger.info(f"Sent full response content for fake stream: {model}") else: logger.warning( @@ -334,7 +334,7 @@ class OpenAIChatService: base_chunk_for_empty, "" ) empty_final_chunk["choices"][0]["finish_reason"] = "stop" - yield f"data: {json.dumps(empty_final_chunk)}\n\\n" + yield f"data: {json.dumps(empty_final_chunk)}\n\n" else: error_message = "Failed to get response from model" if ( @@ -353,7 +353,7 @@ class OpenAIChatService: base_chunk_for_error, json.dumps({"error": error_message}) ) error_chunk["choices"][0]["finish_reason"] = "stop" - yield f"data: {json.dumps(error_chunk)}\n\\n" + yield f"data: {json.dumps(error_chunk)}\n\n" async def _real_stream_logic_impl( self, model: str, payload: Dict[str, Any], api_key: str @@ -389,7 +389,7 @@ class OpenAIChatService: ) in openai_optimizer.optimize_stream_output( text, lambda t: self._create_char_openai_chunk(openai_chunk, t), - lambda c: f"data: {json.dumps(c)}\n\\n", + lambda c: f"data: {json.dumps(c)}\n\n", ): yield optimized_chunk_data else: @@ -405,12 +405,12 @@ class OpenAIChatService: ): # For older compatibility tool_call_flag = True - yield f"data: {json.dumps(openai_chunk)}\n\\n" + yield f"data: {json.dumps(openai_chunk)}\n\n" if tool_call_flag: - yield f"data: {json.dumps(self.response_handler.handle_response({}, model, stream=True, finish_reason='tool_calls'))}\n\\n" + yield f"data: {json.dumps(self.response_handler.handle_response({}, model, stream=True, finish_reason='tool_calls'))}\n\n" else: - yield f"data: {json.dumps(self.response_handler.handle_response({}, model, stream=True, finish_reason='stop'))}\n\\n" + yield f"data: {json.dumps(self.response_handler.handle_response({}, model, stream=True, finish_reason='stop'))}\n\n" async def _handle_stream_completion( self, model: str, payload: Dict[str, Any], api_key: str @@ -451,7 +451,7 @@ class OpenAIChatService: # If the generator completes, it means all its data chunks (including stop/tool_calls) were yielded. # Now, we send the [DONE] marker for the stream. - yield "data: [DONE]\n\\n" + yield "data: [DONE]\n\n" logger.info( f"Streaming completed successfully for model: {model}, FakeStream: {settings.FAKE_STREAM_ENABLED}, Attempt: {retries + 1}" ) @@ -536,8 +536,8 @@ class OpenAIChatService: logger.error( f"Streaming failed permanently for model {model} after {retries} attempts." ) - yield f"data: {json.dumps({'error': f'Streaming failed after {retries} retries.'})}\n\\n" - yield "data: [DONE]\n\\n" + yield f"data: {json.dumps({'error': f'Streaming failed after {retries} retries.'})}\n\n" + yield "data: [DONE]\n\n" async def create_image_chat_completion( self, request: ChatRequest, api_key: str