> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ch88.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 限流、并发与重复提交

> 当前限流策略、客户端并发建议和安全重试方式

## 当前规则

平台当前**不对外承诺固定 QPS、每分钟请求数或并发上限**。可用吞吐量会受到成员所分配上游密钥、模型负载和平台保护策略影响。

当平台或上游无法继续接受请求时，会返回 `429 Too Many Requests`。如果响应包含 `Retry-After`，必须至少等待指定秒数后再重试。

## 客户端建议值

以下是稳定接入建议，不代表平台硬性额度：

| 调用类型       |             建议并发 | 重试建议                |
| ---------- | ---------------: | ------------------- |
| 图片上传       | 每把 Key 不超过 3 个并发 | 网络错误或 `5xx` 后退避重试   |
| 商品分析/A+ 策划 | 每把 Key 不超过 1 个并发 | 最多重试 2 次，避免重复 AI 调用 |
| 生图任务提交     | 每把 Key 不超过 2 个并发 | 收到明确失败后再重试          |
| 任务查询       |     每个任务只保留一个轮询器 | 使用 5、8、13、20、30 秒退避 |

如果业务需要更高吞吐量，请在客户端建立任务队列，不要无限并发提交。

## 重复提交保护

同一成员、同一操作、完全相同的生成请求内容在 10 分钟内会触发重复提交保护：

* 首次请求仍在处理中：返回 `409 REQUEST_ALREADY_IN_PROGRESS`。
* 首次请求已经成功：复用首次成功响应，并返回响应头 `X-Linggan-Idempotency-Replayed: true`。
* 首次请求失败：释放记录，后续可以重新提交。

当前去重以“成员 + 操作 + 请求内容”为准。修改请求体中的生图要求会被视为新请求。

## 指数退避

```javascript theme={null}
const delays = [1000, 2000, 4000, 8000];

for (const delay of delays) {
  const response = await callLingganApi();
  if (response.ok) break;

  if (response.status !== 429 && response.status < 500) {
    throw new Error(await response.text());
  }

  const retryAfter = Number(response.headers.get('Retry-After'));
  const waitMs = Number.isFinite(retryAfter)
    ? retryAfter * 1000
    : delay + Math.floor(Math.random() * 500);

  await new Promise(resolve => setTimeout(resolve, waitMs));
}
```

<Warning>
  对 `400`、`401`、`403` 和大多数 `409` 不要自动重试；先修正参数、密钥或成员配置。只有错误响应明确包含 `retryable: true` 时，才建议在等待后重试。
</Warning>
