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,