> ## 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-ում:

Յուրաքանչյուր բանալի ունի իր պատուհանը՝ լռելյայն **120 հարցում 60 վայրկյանում**: Դա չարաշահումից պաշտպանող գործառնական առաստաղ է, ոչ թե սակագնային պլանի քվոտա: Օգտագործումն ինքնին հաշվառվում է սեփականատիրոջ հաշվեկշռով, ոչ թե այս հաշվիչով, և նույն սեփականատիրոջ բանալիները պատուհանը չեն կիսում:

Նույնականացումն աշխատում է սահմանափակիչից առաջ, ուստի չնույնականացված հարցումը երբեք չի ծախսում բանալու բյուջեն:

## Վերնագրեր

Հաջողված 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-ն պատասխանում է `503 api_rate_limit_unavailable`՝ `Retry-After: 5`-ով, փոխանակ հարցումները չհաշվառված բաց թողնելու, և փոխանակ ապակողմնորոշող 429-ի: Դիտարկեք այն ինչպես ցանկացած այլ անցողիկ սխալ. սպասեք և կրկնեք նույն `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>
