Commit ac090aa

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-04-22 18:16:19
chore(gpt): improve error handling
1 parent 8f64d38
Changed files (3)
src/llm/gpt.py
@@ -107,7 +107,7 @@ async def gpt_response(client: Client, message: Message, *, gpt_stream: bool = G
     kwargs["progress"] = status_msg
     if context_type.get("error"):
         logger.warning(context_type["error"])
-        await modify_progress(message=status_msg, text=context_type["error"], force_update=True, **kwargs)
+        await modify_progress(message=status_msg, text=f"{msg}\n{context_type['error']}", force_update=True, **kwargs)
     config, response = await merge_tools_response(config, **kwargs)
     # skip send a new request if tool_model is the same as the current model
     if response and config["completions"]["model"] == GPT.TOOLS_MODEL and response.get("content"):
src/llm/models.py
@@ -23,7 +23,7 @@ def get_context_type(conversations: list[Message]) -> dict:
         if info["mtype"] == "audio":
             has_audio = True
     if has_audio or has_video:
-        res["error"] = f"⚠️暂不支持视频/音频模型, 已忽略上下文中的视频/音频消息\n可以先用 `{PREFIX.ASR}` 命令转为文字后再使用 `{PREFIX.GPT}`"
+        res["error"] = f"⚠️已忽略上下文中的视频/音频消息\n可以先用 `{PREFIX.ASR}` 命令转为文字后再使用 `{PREFIX.GPT}`"
     return res
 
 
src/llm/response_stream.py
@@ -116,14 +116,15 @@ async def parse_error(resp: dict, retry: int, **kwargs) -> dict:
     """Parse GPT error.
 
     Returns:
-        {"error": bool, "retry": bool}
+        {"error": "msg", "retry": bool}
     """
-    error_result = {"error": False, "retry": False}
+    error_result = {"error": "", "retry": False}
     error_code = glom(resp, "error.code", default=0)
     error_msg = ""
     content = None
     reasoning_content = None
     is_finished = False
+    finish_reason = ""
     tool_call = {}
     with contextlib.suppress(Exception):
         metadata = glom(resp, "error.metadata.raw", default="{}")
@@ -132,13 +133,16 @@ async def parse_error(resp: dict, retry: int, **kwargs) -> dict:
         content = glom(choice, "delta.content", default=None)
         reasoning_content = glom(choice, "delta.reasoning_content", default=None)
         tool_call = glom(choice, "delta.tool_calls.0", default=None)
-        is_finished = glom(choice, "finish_reason", default="") == "stop"
+        finish_reason = glom(choice, "finish_reason", default=None)
+        is_finished = str(finish_reason) == "stop"
     if is_finished or any(x is not None for x in [content, reasoning_content, tool_call]):
-        return {"error": False, "retry": False}
+        return {"error": "", "retry": False}
     if error_code != 0:
         logger.warning(resp)
-        error_result["error"] = True
+        error_result["error"] = error_msg
         await modify_progress(text=f"[{error_code}] {error_msg}\n重试次数: {retry + 1}/{GPT.MAX_RETRY + 1}", force_update=True, **kwargs)
         if retry < GPT.MAX_RETRY:
             error_result["retry"] = True
+    if finish_reason is not None:
+        error_result["error"] = finish_reason
     return error_result