From fab2a25bcc8107a2a311aa245036c1b0b101a223 Mon Sep 17 00:00:00 2001 From: chaos Date: Thu, 2 Jul 2026 17:23:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8A=E6=B8=B8=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=97=A5=E5=BF=97=20+=20ModelArts=E9=94=99=E8=AF=AF=E2=86=92Op?= =?UTF-8?q?enAI=E6=A0=BC=E5=BC=8F=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 非200响应记录WARNING日志(含响应体前500字节) - 华为云ModelArts错误格式(error_code/error_msg)转为OpenAI标准格式 - 解决客户端'压缩上下文'报错时错误格式不兼容问题 - 根因: prompt超196608 tokens触发ModelArts.81001 --- ai/huawei_gateway.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ai/huawei_gateway.py b/ai/huawei_gateway.py index fb4ca3d..2cd5526 100755 --- a/ai/huawei_gateway.py +++ b/ai/huawei_gateway.py @@ -337,6 +337,14 @@ def proxy(subpath): if k.lower() not in skip_headers: response_headers.append((k, v)) + # 记录上游非200响应 + if resp.status_code != 200: + try: + _err_peek = resp.content[:500] + logger.warning(f"上游返回 {resp.status_code}: {_err_peek.decode('utf-8', errors='replace')}") + except Exception: + logger.warning(f"上游返回 {resp.status_code}") + # SSE 流式转发 content_type = resp.headers.get('Content-Type', '') if 'text/event-stream' in content_type or resp.headers.get('Transfer-Encoding', '') == 'chunked': @@ -358,6 +366,26 @@ def proxy(subpath): # 非流式响应:读取完整内容 content = resp.content resp.close() + + # 华为云 ModelArts 错误 → OpenAI 标准格式 + if resp.status_code >= 400: + try: + import json as _jj + err = _jj.loads(content) + if 'error_code' in err and 'error_msg' in err: + openai_err = { + "error": { + "message": err.get('error_msg', ''), + "type": err.get('error', {}).get('type', 'server_error'), + "code": err.get('error_code', ''), + "param": None + } + } + content = _jj.dumps(openai_err).encode('utf-8') + response_headers = [(k, v) for k, v in response_headers if k.lower() != 'content-length'] + except Exception: + pass + return Response( content, status=resp.status_code,