错误
当请求失败时,Shisa 服务会通过 HTTP 状态码和描述问题所在的 JSON 主体来通知该问题。本指南涵盖你会遇到的状态码、承载详情的 JSON 结构,以及在哪里查找各端点的错误表。
HTTP 状态码
请先检查响应状态——它会告诉你问题的类别以及如何解决。
| Status | Meaning | How to resolve |
|---|---|---|
400 | 错误请求——参数无效或缺失 | 检查请求主体和必填字段;具体字段请参见错误消息。 |
401 | 身份验证失败 | 验证完整API密钥和bearer请求头。请参见身份验证。 |
403 | 访问被拒绝 | 密钥有效,但不能使用请求的服务、提供商或模型。 |
404 | 服务/提供商不存在,或私有模型被隐藏 | 重新检查路由/模型以及密钥访问权限。 |
429 | 超出速率限制 | 放慢速度并以退避方式重试。请参见 速率限制。 |
500 | 路由器或后端内部故障 | 短暂延迟后重试;如果持续存在,请通过平台联系支持。 |
502 | 无法连接选定后端 | 退避后重试;故障发生在路由器与后端之间。 |
503 | 服务、依赖项或WebSocket接入暂时不可用 | 除非端点专用错误要求更改配置或权限,否则请退避后重试。 |
JSON 错误结构
路由器生成的响应和后端转发的响应可能具有不同错误正文。请始终先读取HTTP状态。如果正文是JSON,error可能是字符串,也可能是包含code和message等字段的对象。
路由器错误
大多数路由器生成的HTTP错误包含数字代码、错误名称、上下文和字符串消息:
{
"context": ["authMiddleware"],
"code": 104,
"name": "ErrAuthenticationFailed",
"error": "Authentication error: Invalid token"
}
结构化错误与后端错误
某些验证和WebSocket接入错误使用对象形式的error:
{
"error": {
"code": "tts_text_too_long",
"message": "TTS text exceeds maximum length",
"max_chars": 5000,
"actual_chars": 5001
}
}
后端可能返回其他JSON结构,甚至非JSON正文,路由器可能原样转发其状态和正文。不要依赖精确消息文本进行分支判断。
提示
在解析主体之前,请始终检查 response.ok(或状态码)。429 或 500 可能不包含你成功路径所期望的 JSON,因此先按状态分支可以避免出现第二个令人困惑的解析错误。
在实践中,先检查状态再解析:
const response = await fetch(url, options);
if (!response.ok) {
const detail = await response.json().catch(() => null);
const error = detail?.error;
const message =
typeof error === 'string'
? error
: error?.message ?? detail?.message ?? response.statusText;
throw new Error(`Shisa request failed (${response.status}): ${message}`);
}
const data = await response.json();
response = requests.post(url, headers=headers, json=payload)
if not response.ok:
try:
detail = response.json()
except ValueError:
detail = {}
error = detail.get("error")
message = error if isinstance(error, str) else (
error.get("message") if isinstance(error, dict) else None
)
raise RuntimeError(
f"Shisa request failed ({response.status_code}): "
f"{message or detail.get('message') or response.reason}"
)
data = response.json()
各服务错误详情
错误字段和确切的消息因端点而异。有关特定端点的错误表和请求要求,请参见每项服务的 API 参考: