feat: 上游错误日志 + ModelArts错误→OpenAI格式转换

- 非200响应记录WARNING日志(含响应体前500字节)
- 华为云ModelArts错误格式(error_code/error_msg)转为OpenAI标准格式
- 解决客户端'压缩上下文'报错时错误格式不兼容问题
- 根因: prompt超196608 tokens触发ModelArts.81001
This commit is contained in:
chaos
2026-07-02 17:23:34 +08:00
parent e9c635dbd0
commit fab2a25bcc
+28
View File
@@ -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,