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

# Сораулар лимитлары

> Һәр ачкычка техник тәрәзә; аның халәте уңышлы JSON җавапларының һәм 429 җавабының башламнарында күрсәтелә.

Һәр ачкычның үз тәрәзәсе бар: килешү буенча **60 секундка 120 сорау**. Бу — тариф квотасы түгел, ә кыянәтле куллануга каршы операцион чик. Куллануның үзе бу санагыч белән түгел, ә хуҗаның балансы белән исәпләнә, һәм бер хуҗаның ачкычлары тәрәзәне уртак кулланмый.

Аутентификация лимитлаучыдан алда эшли, шуңа күрә аутентификацияләнмәгән сорау ачкычның бюджетын беркайчан сарыф итми.

## Башламнар

Уңышлы JSON җаваплары (`200`) һәм `429` җавабы тәрәзәнең халәтен йөртә:

| Башлам                  | Мәгънәсе                                 |
| ----------------------- | ---------------------------------------- |
| `X-RateLimit-Limit`     | Тәрәзәгә рөхсәт ителгән сораулар         |
| `X-RateLimit-Remaining` | Агымдагы тәрәзәдә калган сораулар        |
| `X-RateLimit-Reset`     | Тәрәзә яңарган Unix вакыты (секундларда) |

Агымлы эндпоинтның `text/event-stream` җавабы һәм башка хата конвертлары (`401`, `403`, `404`, `409`, `422`, `503`, `500`) бу башламнарны йөртми; һәр җавапта `X-Request-ID` гына бар. Клиентны `X-RateLimit-Remaining` буенча көйләсәгез, булмаган башламны нуль дип түгел, ә «билгесез» дип карагыз.

Тәрәзә тулгач API `429 rate_limit_exceeded` җавабын бирә һәм `Retry-After` (тәрәзә яңарганчы секундлар) өсти.

```http theme={null}
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1789470060
Retry-After: 17
X-Request-ID: 7f20a5f0-5dde-48cf-94aa-38acbbd218e0

{"error": {"code": "rate_limit_exceeded", "message": "Rate limit exceeded for this API key; try again later", "request_id": "7f20a5f0-5dde-48cf-94aa-38acbbd218e0"}}
```

## Лимитлаучының үзе эшләмәгәндә

Лимитлаучы **ябык** режимда туктый. Аның саклагычы эшләмәсә, API сорауларны исәпсез үткәрү урынына һәм ялгыштыручы 429 урынына `Retry-After: 5` белән `503 api_rate_limit_unavailable` җавабын бирә. Аны башка вакытлыча хата кебек карагыз: көтегез һәм шул ук `Idempotency-Key` белән кабатлагыз.

<Warning>
  Чикне күтәрү өчен трафикны бер агентның берничә ачкычына таратмагыз. Һәр ачкычның үз диалоглары бар, шуңа күрә бер үк ахыргы кулланучының тарихы таркалып бетәр иде. Югарырак лимит кирәк булса, безнең белән элемтәгә керегез.
</Warning>

## Клиент ягында көйләү

<CodeGroup>
  ```bash curl theme={null}
  # Retries on 429/503 after Retry-After, then prints the window state of the final answer.
  while :; do
    status=$(curl -s -o /dev/null -D headers.txt -w '%{http_code}' \
      "$CHATTLER_BASE_URL/v1/agents/$CHATTLER_AGENT_ID/conversations?limit=20" \
      -H "Authorization: Bearer $CHATTLER_API_KEY")
    if [ "$status" = "429" ] || [ "$status" = "503" ]; then
      sleep "$(grep -i '^Retry-After:' headers.txt | tr -d '\r' | awk '{print $2}')"
      continue
    fi
    grep -i '^X-RateLimit-' headers.txt
    break
  done
  ```

  ```python Python theme={null}
  import time

  import httpx


  def request_with_pacing(method: str, url: str, **kwargs) -> httpx.Response:
      while True:
          response = httpx.request(method, url, headers=HEADERS, timeout=120, **kwargs)
          if response.status_code in (429, 503):
              time.sleep(float(response.headers.get("Retry-After", "5")))
              continue
          if int(response.headers.get("X-RateLimit-Remaining", "1")) == 0:
              reset_at = int(response.headers.get("X-RateLimit-Reset", "0"))
              time.sleep(max(0.0, reset_at - time.time()))
          return response
  ```

  ```javascript Node theme={null}
  async function requestWithPacing(url, init = {}) {
    for (;;) {
      const response = await fetch(url, {
        ...init,
        headers: { Authorization: `Bearer ${apiKey}`, ...(init.headers ?? {}) },
      });
      if (response.status === 429 || response.status === 503) {
        const wait = Number(response.headers.get("Retry-After") ?? 5);
        await new Promise((r) => setTimeout(r, wait * 1000));
        continue;
      }
      if (response.headers.get("X-RateLimit-Remaining") === "0") {
        const resetAt = Number(response.headers.get("X-RateLimit-Reset") ?? 0) * 1000;
        await new Promise((r) => setTimeout(r, Math.max(0, resetAt - Date.now())));
      }
      return response;
    }
  }
  ```
</CodeGroup>
