错误与限制
理解 API 错误、状态码以及基于计划的资源限制。
理解 API 错误、rate limit 以及计划限制。
错误响应格式
所有错误遵循统一格式:
{
"statusCode": 400,
"statusMessage": "Name is required",
"message": "Name is required",
"url": "/api/v1/minds",
"error": true
}
| 字段 | 说明 |
|---|---|
statusCode | HTTP 状态码 |
statusMessage | 可读的错误描述(由处理器按错误类型设置 —— 对于校验错误,这是具体问题,例如 "Mind not found" 或 "Invalid Mind ID format") |
message | 在 v1 错误中与 statusMessage 内容相同。在 debug 构建的 5xx 响应中,保留用于堆栈或额外上下文。 |
url | 请求路径(由 Nuxt H3 添加) |
error | 错误响应中为 true(由 Nuxt H3 添加) |
在程序化处理时始终依赖
statusCode,并使用statusMessage(或message)获取可读原因。url和error字段是底层框架提供的便利元数据。
HTTP 状态码
2xx 成功
| 状态码 | 状态 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源创建成功(例如 POST /minds、POST /minds/{id}/knowledge) |
| 202 | Accepted | 请求已接受,正在异步处理(例如带有 keywords 的 POST /minds/{id}/knowledge) |
| 204 | No Content | 请求成功,无响应体(例如 DELETE /minds/{id}/knowledge/{itemId}) |
4xx 客户端错误
| 状态码 | 状态 | 说明 |
|---|---|---|
| 400 | Bad Request | 请求参数无效 |
| 401 | Unauthorized | API key 缺失或无效 |
| 403 | Forbidden | 访问被拒绝或达到计划限制 |
| 404 | Not Found | 资源不存在 |
| 415 | Unsupported Media Type | Content-Type header 错误 |
| 422 | Unprocessable Entity | 请求格式正确但无法执行,例如在已就绪 Minds 少于 10 个的受众上发起验证(AUDIENCE_TOO_SMALL) |
| 429 | Too Many Requests | 超过 rate limit |
5xx 服务器错误
| 状态码 | 状态 | 说明 |
|---|---|---|
| 500 | Internal Server Error | 服务器端错误 |
| 503 | Service Unavailable | 服务暂不可用 |
常见错误
400 Bad Request
缺少必填字段:
{
"statusCode": 400,
"statusMessage": "Name is required"
}
输入无效:
{
"statusCode": 400,
"statusMessage": "File too large: document.pdf (55.2MB). Maximum size is 50MB."
}
401 Unauthorized
缺少 API Key:
{
"statusCode": 401,
"statusMessage": "Unauthorized"
}
解决方案: 包含 Authorization header:
-H "Authorization: Bearer minds_your_api_key"
403 Forbidden
达到计划限制:
{
"statusCode": 403,
"statusMessage": "Starter plan limit reached",
"message": "Starter plan limit reached",
"url": "/api/v1/minds",
"error": true,
"data": {
"code": "PLAN_LIMIT",
"limitType": "sparks",
"currentPlan": "premium",
"limit": 100,
"current": 100
}
}
访问被拒绝:
{
"statusCode": 403,
"statusMessage": "Access denied"
}
404 Not Found
资源不存在:
{
"statusCode": 404,
"statusMessage": "Mind not found"
}
415 Unsupported Media Type
错误的 Content-Type:
{
"statusCode": 415,
"statusMessage": "Unsupported Content-Type. Use application/json for links or multipart/form-data for files"
}
解决方案: 使用正确的 Content-Type header:
- JSON 请求使用
application/json - 文件上传使用
multipart/form-data
429 Too Many Requests
超过 rate limit:
{
"statusCode": 429,
"statusMessage": "Too many requests. Please try again later."
}
Rate Limit
v1 API 按已认证账户执行固定时间窗限流。部署默认值为每分钟 300 个请求,但可由运营配置调整。请始终读取 RateLimit-Limit 和 RateLimit-Remaining;收到 429 后,按 Retry-After 指定的秒数等待。
计划限制
请查看生成的套餐限制表了解当前公共默认值。合同覆盖值可能不同,因此认证错误中的 data.limit 和 data.current 是该请求的权威值。Starter 套餐在 API payload 中表示为 "premium"。
Mind 限制示例
达到限制时的错误:
{
"statusCode": 403,
"statusMessage": "Starter plan limit reached",
"message": "Starter plan limit reached",
"url": "/api/v1/minds",
"error": true,
"data": {
"code": "PLAN_LIMIT",
"limitType": "sparks",
"currentPlan": "premium",
"limit": 100,
"current": 100
}
}
知识上传限制
- 文件大小: 每个文件最大 50MB(所有计划)
- 存储: 目前未强制执行明确的存储限制
API Key 限制
- 最大 Key 数量: 目前未强制执行任何上限。
受众验证失败
在已就绪 Minds 少于 10 个的受众上发起受众验证,会返回 422 及代码 AUDIENCE_TOO_SMALL。受众规模超过你的方案在单个研究中允许的上限时,会以上文所述的标准方案限制错误拒绝。
成功发起后,验证会在后台运行,因此大多数失败并不是 HTTP 错误。请改为读取验证批次的 failure 字段。批次可能以下列代码之一结束:
| 代码 | 含义 |
|---|---|
AUDIENCE_TOO_SMALL | 受众的已就绪 Minds 少于 10 个。发起验证时也会以 422 返回 |
MINDS_NEED_RETRAINING | 受众中的 Minds 需要重新训练后才能作答 |
NOT_ENOUGH_QUESTIONS | 适合该受众的问题少于 8 个,因此没有提问 |
NOT_ENOUGH_RESPONSES | 运行所需的合成回答多于你的剩余数量 |
NO_FITTING_SURVEY | 没有与该受众匹配的已发布调查 |
NO_USABLE_SURVEY | 没有任何调查可以验证该受众 |
NO_SCORE | 没有任何调查能为该受众评分 |
RUNS_REFUSED | 无法启动验证运行 |
SURVEY_NOT_FOUND | 找不到指定的调查 |
SURVEY_FILES_UNREADABLE | 无法读取上传的调查文件 |
SURVEY_RESULTS_NOT_FOUND | 上传的文件中没有可供对照的已发布结果 |
VALIDATION_TOO_LARGE | 该验证需要超过 30,000 个回答 |
最佳实践
错误处理
始终处理错误:
async function requestJson(url, apiKey, data) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
const text = await response.text();
let result = null;
if (text) {
try {
result = JSON.parse(text);
} catch {
if (response.ok) throw new Error('Expected a JSON response');
}
}
if (!response.ok) {
throw Object.assign(new Error(result?.statusMessage || result?.message || `HTTP ${response.status}`), {
status: response.status,
data: result?.data,
retryAfter: response.headers.get('Retry-After')
});
}
return result;
}
重试逻辑
实现智能重试:
- 读取遇到暂时性的
429或5xx响应时,可使用有次数限制的指数退避重试,并遵守Retry-After。只有端点明确支持幂等性时才能重试写入,且必须保留相同的键和请求体。超时后若无法确认结果,应先检查已有资源或任务,再决定是否重新提交。 - 使用指数退避
- 设置最大重试次数
- 不要对
4xx错误重试(429 除外)
监控
追踪你的使用情况:
- 记录 rate limit header
- 监控错误率
- 为重复出现的错误设置告警
- 追踪响应时间
在需要时升级
如果你遇到以下情况,请升级计划:
- 频繁触发 rate limit
- 需要更多 mind
- 需要更大的文件上传
- 需要优先支持
获取帮助
查看状态
监控我们的服务状态:
- Minds 服务状态
- 关注 @mindsai_co 获取更新
联系支持
如果你遇到:
- 持续的 500 错误
- 不正确的限流
- 异常行为
联系我们:
- 反馈表单
- 邮箱:[email protected]
查阅文档
状态码速查
所有 HTTP 状态码的快速参考:
2xx Success
├─ 200 OK
└─ 201 Created
4xx Client Error
├─ 400 Bad Request
├─ 401 Unauthorized
├─ 403 Forbidden
├─ 404 Not Found
├─ 415 Unsupported Media Type
└─ 429 Too Many Requests
5xx Server Error
├─ 500 Internal Server Error
└─ 503 Service Unavailable


