Minds Team

错误与限制

理解 API 错误、状态码以及基于计划的资源限制。

理解 API 错误、rate limit 以及计划限制。

错误响应格式

所有错误遵循统一格式:

{
  "statusCode": 400,
  "statusMessage": "Name is required",
  "message": "Name is required",
  "url": "/api/v1/minds",
  "error": true
}
字段说明
statusCodeHTTP 状态码
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 成功

状态码状态说明
200OK请求成功
201Created资源创建成功(例如 POST /minds、POST /minds/{id}/knowledge)
202Accepted请求已接受,正在异步处理(例如带有 keywords 的 POST /minds/{id}/knowledge)
204No Content请求成功,无响应体(例如 DELETE /minds/{id}/knowledge/{itemId})

4xx 客户端错误

状态码状态说明
400Bad Request请求参数无效
401UnauthorizedAPI key 缺失或无效
403Forbidden访问被拒绝或达到计划限制
404Not Found资源不存在
415Unsupported Media TypeContent-Type header 错误
422Unprocessable Entity请求格式正确但无法执行,例如在已就绪 Minds 少于 10 个的受众上发起验证(AUDIENCE_TOO_SMALL)
429Too Many Requests超过 rate limit

5xx 服务器错误

状态码状态说明
500Internal Server Error服务器端错误
503Service 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
  • 需要更大的文件上传
  • 需要优先支持

查看计划

获取帮助

查看状态

监控我们的服务状态:

联系支持

如果你遇到:

  • 持续的 500 错误
  • 不正确的限流
  • 异常行为

联系我们:

查阅文档

状态码速查

所有 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