From c915e6ce03385a1d66f5f06e882436516cec2af0 Mon Sep 17 00:00:00 2001 From: mastertion <41539871+mastertion@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:32:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=9F=90=E4=BA=9B=20API=20?= =?UTF-8?q?=E5=BC=BA=E5=88=B6=E8=BF=94=E5=9B=9E=20SSE=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=20Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 兼容某些 API 强制返回 SSE 格式的 Bug --- .../core/provider/sources/openai_source.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index d4436f8712..173c447a48 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -462,7 +462,29 @@ async def _query(self, payloads: dict, tools: ToolSet | None) -> LLMResponse: stream=False, extra_body=extra_body, ) - + + # --- 新增:兼容某些 API 强制返回 SSE 格式的 Bug --- + if isinstance(completion, str): + logger.warning(f"检测到 API 返回了字符串而非对象,尝试自动修复: {completion[:100]}...") + try: + # 如果是 data:{...} 格式,去掉 "data:" 并解析 JSON + json_str = completion.strip() + if json_str.startswith("data:"): + json_str = json_str[5:].strip() + + # 尝试解析 JSON + completion_dict = json.loads(json_str) + + # 重新构造 ChatCompletion 对象 + completion = ChatCompletion.construct(**completion_dict) + logger.info("成功将字符串响应转换为 ChatCompletion 对象。") + + except Exception as e: + logger.error(f"自动修复失败: {e}") + # 如果修复失败,继续抛出原始错误 + raise Exception(f"API 返回格式错误且无法修复:{type(completion)}: {completion}。") + # --------------------------------------------------- + if not isinstance(completion, ChatCompletion): raise Exception( f"API 返回的 completion 类型错误:{type(completion)}: {completion}。",